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 *
不一定是个好主意。
我有两张桌子——客户和个人。它们在两个表中都由 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 *
不一定是个好主意。