SELECT * 连接上列名的别名

Alias for column name on a SELECT * join

我有两张桌子——客户和个人。它们在两个表中都由 personID 链接。

我正在尝试创建视图。

我试过了:

SELECT * FROM client INNER JOIN person ON client.personID = person.personID

它不喜欢它说 Duplicate column name 'personID

我认为如果您使用 table.column 作为标识符就好了。我尝试使用和不使用单引号。

如果我想要特定的列 EG client.personID AS perID,我可以做一个别名,但是当它们是 JOIN 定义的一部分时,我无法弄清楚如何为这个位置 IE 中的列创建一个别名。

我找了一个多小时,一直找不到。

编辑: 这是一个特别关于在 SELECT * 连接中别名列的问题。每个人似乎都在说放在明确的专栏中。我知道该怎么做。我故意想使用 * JOIN 进行开发工作。这将是一个很小的数据库,所以即使它留在里面也没有关系。哦,这只是存储为 VIEW 的问题,而不是存储为 SQL 查询或一些代码.

尝试指定要显示的所有列名,而不是使用 * 列出列名以及 table 两个 table 通用的名称,例如不要说 personID , 输入 client.personID

SELECT
        c.*,
        p.`all`,
        p.need,
        p.`fields`,
        p.`of`,
        p.person,
        p.`table`,
        p.without,
        p.personID_field
    FROM client c
    INNER JOIN person p
        ON p.personID = c.personID

看来您必须使用别名为列名添加别名。

SELECT client.column1 as col1, client.column2 as col2, person.column1 as colp1 FROM client INNER JOIN person ON client.personID = person.personID

当然,将列名替换为真实的列名,因为使用更吸引人的别名

如果有帮助请告诉我们

更新 #1

我尝试在 mySQL 5.5 和 5.6

中使用 sqlfiddle 创建 2 个表

见 link : http://sqlfiddle.com/#!9/e70ab/1

它按预期工作。

也许你可以分享你的表架构。

示例代码如下:

CREATE TABLE Person
(
personID int,
  name varchar(255)
);

CREATE TABLE Client
(
ID int,
  name varchar(255),
personID int
);

insert into Person values(1, 'person1');
insert into Person values(2, 'person2');
insert into Person values(3, 'person3');

insert into Client values(1, 'client1', 1);
insert into Client values(2, 'client2', 1);
insert into Client values(3, 'client1', 1);

SELECT * FROM client 
INNER JOIN person 
ON client.personID = person.personID;

问题是什么

在SQL中,top-level SELECT语句允许两次产生相同的列名。任何形式的嵌套 SELECT、派生 table 或视图都必须生成唯一的列名称。这就是为什么加入两个 table 并简单地 selecting 来自 table 的所有列会在视图中产生问题。

通常,人们会通过 well-established 前缀命名约定为视图中的所有列添加前缀,例如

CREATE VIEW v_client_person AS
SELECT
  client.clientID AS clie_clientID,
  client.name     AS clie_name,
  client.personID AS clie_personID,
  person.personID AS pers_personID,
  person.name     AS pers_name
FROM ...

这是个好主意,因为您可以轻松地从这样的视图中消除任何列的歧义。

解决方法

如果 personID 是两个 table 之间的 只有 冲突列,那么您可以使用 JOIN .. USING 作为解决方法:

CREATE VIEW v_client_person AS
SELECT * FROM client INNER JOIN person USING (personID)

USING 在大多数数据库中都有很好的效果,包括 MySQL,在结果记录中只生成一次连接列,与 table 它的来源无关。

关于 SELECT * 的一般说明

但是,一般来说,您不应在视图中使用 SELECT *,而应明确列出并命名所有列为 或在我之前的注释中。您应该省略 SELECT *:

的原因有多种
  • In top-level selects: Performance(这在嵌套的 selects 中可能不是这样的问题,如果顶层 select 't select 嵌套的所有列 select)
  • 在视图中(包括派生的 tables):您的视图定义取决于列的存储顺序及其名称。当 table 列发生变化时,您的视图定义是陈旧的并且行为有些未定义。控制查询输出通常是个好主意,这就是为什么 SELECT * 不一定是个好主意。