MySQL - 没有重复列的左连接

时间:2015-04-27 03:49:50

标签: mysql left-join

我遇到了一些我正在尝试使用的连接语句的问题。我有两个表需要加入,两个表都包含所有信息。他们如下。

INSTITUTION
IName | ALocation_ID | IPicture

ADDRESS
ALocation_ID | AStreet | AZip | ...(other relevant fields)

我一直在尝试使用:

CREATE VIEW InstitutionView
AS SELECT * FROM INSTITUTION 
LEFT JOIN ADDRESS 
ON INSTITUTION.ALocation_ID=ADDRESS.ALocation_ID;

但我收到的错误说明了重复的列。我做错了什么?

3 个答案:

答案 0 :(得分:1)

您必须单独选择列。希望这能帮到你一点点。

CREATE VIEW InstitutionView
AS 
SELECT address.id,address.iname,address.alocation_id,ipicture,institution.astreet,institution.azip
FROM INSTITUTION 
LEFT JOIN ADDRESS 
ON INSTITUTION.ALocation_ID=ADDRESS.ALocation_ID; 

答案 1 :(得分:0)

这是因为两个表中都存在ALocation_ID列。 尝试创建明确命名所需列的视图。

CREATE VIEW InstitutionView
AS SELECT Iname,INSTITUTION.ALocation_ID,IPicture,AStreet,AZip ...
FROM INSTITUTION 
LEFT JOIN ADDRESS 
ON INSTITUTION.ALocation_ID=ADDRESS.ALocation_ID;

答案 2 :(得分:0)

从概念上讲,JOIN首先创建一个中间交叉产品,其中的列由表名称或由该表中的列名称分隔的别名引用;然后ON和WHERE过滤掉不匹配的行以给出第二个中间结果。如果列名只出现在一个表中,那么您可以省略表&点以引用该列。

MySQL 5.6 Reference Manual :: 13.2.9 SELECT Syntax

  

您可以将列引用为col_name,tbl_name.col_name或db_name.tbl_name.col_name。除非引用不明确,否则无需为列引用指定tbl_name或db_name.tbl_name前缀。有关需要更明确的列引用形式的歧义的示例,请参见第9.2.1节“标识符限定符”。

MySQL 5.6 Reference Manual :: 9.2.1 Identifier Qualifiers

  

假设表t1和t2每个都包含一个列c,并且在一个同时使用t1和t2的SELECT语句中检索c。在这种情况下,c是不明确的,因为它在语句中使用的表中不是唯一的。您必须使用表名t1.c或t2.c对其进行限定,以指明您的意思。

因此:

CREATE VIEW InstitutionView
AS SELECT IName,I.ALocation_ID,IPicture,AStreet,AZip,...
FROM INSTITUTION I
LEFT JOIN ADDRESS A
ON I.ALocation_ID=A.ALocation_ID;

您可能认为如果JOIN为ON或WHERE“=”则不存在歧义。但是:

在INNER JOIN的情况下,如果没有隐式转换,那么比较相等的列将具有相同的值;但是否则不同的值可以比较“=”。因此,您不能仅使用列名来标识一个值。

此外,对于LEFT JOIN,左表中不匹配的行被NULL扩展并被添加以给出第三个中间结果;因此,在一行中,一个表中的列中的非NULL可以在另一个表的同一列中显示为NULL。因此,您不能仅使用列名来标识一个值。

此外,甚至不需要测试JOIN中两列的相等性,甚至不需要提及具有共享名称的两列或任一列。因此,结果可以有两列(每个输入表中有一列)共享一个名称,其中没有期望相等。