当公共列有不同的名称时,如何进行自然连接?

时间:2013-05-02 13:26:02

标签: sql natural-join

我需要在名为Customers和Addresses(关系1:1)的两个表上进行自然连接,这些表中的公共列是key-ID(根据该列自然连接将运行)。但是,表Customer中的这个列被称为“ID_Customer”,并且在表中的地址中称为“ID”。

因此,自然连接无法正常工作,因为程序无法识别它是同一列(具体意义)。

我无法将列名更改为相同(因为很多原因..) 有什么方法可以让我的工作 - 所以程序会理解那些是相同的列吗?

3 个答案:

答案 0 :(得分:5)

所以不要使用natural join。改为明确join

from Customer c join
     Address a
     on a.id = c.id_Customer

另外,如果实际的连接条件是:

,我不会感到惊讶
     on a.id_Customer = c.id

(使用id作为表的主键时,最好将表名包含在foregn引用中。)

作为一般规则,从长远来看,自然连接是一个糟糕的选择。您可以将这些查询存储在存储过程,触发器或应用程序中。然后有人修改表结构 - 添加,删除或重命名列。并且,代码停止工作。

我更喜欢始终使用显式连接。

答案 1 :(得分:2)

我们假设Customer和Addresses模式如下:

Customer(ID_customer, name)
Addresses(ID, address)

然后自然连接查询如下:

SELECT * FROM (Customer AS Customer(ID, name) NATURAL JOIN Addresses);

这将按预期连接两个表的ID属性执行自然连接。

答案 2 :(得分:1)

SELECT whatever FROM Customers C, Addresses A
WHERE C.ID_Customer = A.ID