2

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

因此,自然连接无法正常工作,因为程序无法识别它是同一列(通过重要性)。

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

4

3 回答 3

6

所以不要使用natural join. join改为显式:

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

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

     on a.id_Customer = c.id

(当id用作表的主键时,一个好的做法是在外部引用中包含表名。)

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

我更喜欢总是使用显式连接。

于 2013-05-02T13:32:02.333 回答
2

让我们假设客户和地址模式如下:

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

那么自然连接查询如下:

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

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

于 2017-09-15T01:01:41.547 回答
1
SELECT whatever FROM Customers C, Addresses A
WHERE C.ID_Customer = A.ID
于 2013-05-02T13:31:55.210 回答