我需要对名为“客户”和“地址”的两个表(关系 1:1)进行自然连接,这些表中的公共列是键 ID(根据该列,自然连接将运行)。但是 - 表 Customer 中的此列称为“ID_Customer”,在表 Addresses 中称为“ID”。
因此,自然连接无法正常工作,因为程序无法识别它是同一列(通过重要性)。
我无法将列名更改为相同(由于很多原因..)有什么办法可以使这项工作 - 所以程序会理解那些是相同的列?
我需要对名为“客户”和“地址”的两个表(关系 1:1)进行自然连接,这些表中的公共列是键 ID(根据该列,自然连接将运行)。但是 - 表 Customer 中的此列称为“ID_Customer”,在表 Addresses 中称为“ID”。
因此,自然连接无法正常工作,因为程序无法识别它是同一列(通过重要性)。
我无法将列名更改为相同(由于很多原因..)有什么办法可以使这项工作 - 所以程序会理解那些是相同的列?
所以不要使用natural join
. join
改为显式:
from Customer c join
Address a
on a.id = c.id_Customer
另外,如果实际的连接条件是:
on a.id_Customer = c.id
(当id
用作表的主键时,一个好的做法是在外部引用中包含表名。)
作为一般规则,从长远来看,自然连接是一个糟糕的选择。您可以将此类查询存储在存储过程、触发器或应用程序中。然后有人修改表结构——添加、删除或重命名列。而且,代码停止工作。
我更喜欢总是使用显式连接。
让我们假设客户和地址模式如下:
Customer(ID_customer, name)
Addresses(ID, address)
那么自然连接查询如下:
SELECT * FROM ( Customer AS Customer(ID, name) NATURAL JOIN Addresses);
这将按预期执行自然连接,连接两个表的 ID 属性。
SELECT whatever FROM Customers C, Addresses A
WHERE C.ID_Customer = A.ID