我有两张桌子 - 客户和人。它们在两个表中都由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中别名列的问题。每个人似乎都在说出明确的专栏。我知道该怎么做。我特意想用* JOIN进行开发工作。这将是一个很小的数据库,所以如果它保持不变甚至无关紧要。哦和这只是一个问题,存储为VIEW而不是SQL查询或一些代码。
答案 0 :(得分:2)
看起来你必须使用别名为你的列名称命名。
SELECT client.column1 as col1, client.column2 as col2, person.column1 as colp1 FROM client INNER JOIN person ON client.personID = person.personID
当然,将列名替换为真实的列名称,以使用更具吸引力的别名
告诉我们是否有帮助
我尝试在mySQL 5.5和5.6中使用sqlfiddle创建2个表
请参阅链接: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;
答案 1 :(得分:1)
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
答案 2 :(得分:0)
尝试指定要显示的所有列名而不是使用*,列出列名以及两个表共有的表名,例如不要说personID,键入client.personID
答案 3 :(得分:0)
在SQL中,允许顶级SELECT
语句两次生成相同的列名。任何形式的嵌套SELECT
,派生表或视图都必须生成唯一的列名。这就是为什么连接两个表并简单地从表中选择所有列可能会在视图中产生问题。
通常,人们会通过完善的前缀命名约定来为视图中的所有列添加前缀,例如。
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
是两个表之间只有的冲突列,那么您可以使用JOIN .. USING
作为解决方法:
CREATE VIEW v_client_person AS
SELECT * FROM client INNER JOIN person USING (personID)
USING
在大多数数据库(包括MySQL)中都有很好的效果,只能在结果记录中生成一次连接列,而与它所生成的表无关。
SELECT *
的一般说明但是,一般情况下,您不应在视图中使用SELECT *
,而应明确列出并将所有列命名为suggested by wmehanna或在我之前的注释中。您应省略SELECT *
:
SELECT *
不一定是个好主意。