我需要在名为Customers和Addresses(关系1:1)的两个表上进行自然连接,这些表中的公共列是key-ID(根据该列自然连接将运行)。但是,表Customer中的这个列被称为“ID_Customer”,并且在表中的地址中称为“ID”。
因此,自然连接无法正常工作,因为程序无法识别它是同一列(具体意义)。
我无法将列名更改为相同(因为很多原因..) 有什么方法可以让我的工作 - 所以程序会理解那些是相同的列吗?
答案 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