我需要在名爲Customers和Addresses(關係1:1)的兩個表上進行自然連接,這些表中的公共列是關鍵ID(根據自然連接將操作的列)。然而,表Customer中的這個Column被稱爲「ID_Customer」,在表地址中它被稱爲「ID」。當公共列有不同名稱時如何進行自然連接?
因爲這個原因,自然連接無法正常工作,因爲程序沒有識別出它是同一列(按重要性)。
我不能改變列名是相同的(因爲很多原因..) 有什麼辦法可以讓這個工作 - 所以程序會理解那些是相同的列?
我需要在名爲Customers和Addresses(關係1:1)的兩個表上進行自然連接,這些表中的公共列是關鍵ID(根據自然連接將操作的列)。然而,表Customer中的這個Column被稱爲「ID_Customer」,在表地址中它被稱爲「ID」。當公共列有不同名稱時如何進行自然連接?
因爲這個原因,自然連接無法正常工作,因爲程序沒有識別出它是同一列(按重要性)。
我不能改變列名是相同的(因爲很多原因..) 有什麼辦法可以讓這個工作 - 所以程序會理解那些是相同的列?
SELECT whatever FROM Customers C, Addresses A
WHERE C.ID_Customer = A.ID
所以不要使用natural join
。做一個明確的join
代替:
from Customer c join
Address a
on a.id = c.id_Customer
而且,我也不會,如果實際的連接條件是驚訝:
on a.id_Customer = c.id
(當使用id
作爲表的主鍵,一個好的做法是在foregn參考文獻中包含表格名稱)。
作爲一般規則,自然連接在長期內是不好的選擇。您可以將這些查詢存儲在存儲過程,觸發器或應用程序中。然後有人修改表結構 - 添加,刪除或重命名列。並且,代碼停止工作。
我更喜歡總是使用顯式連接。
讓我們假設客戶和地址模式如下:
Customer(ID_customer, name)
Addresses(ID, address)
然後自然連接的查詢是如下:
SELECT * FROM (Customer AS Customer(ID, name) NATURAL JOIN Addresses);
這會執行自然連接爲目的加入ID兩個表的屬性。
什麼是「程序」? – RedFilter 2013-05-02 13:28:08
自然連接是基於具有相同name_的_columns的等連接。如果列不具有相同的名稱,則根據定義,不能有自然連接。使用正常的連接。 (並且不要在你的問題中寫下「緊急」,尤其是不要在標題中寫出「緊急」,除非你正在尋找負面關注。) – Mat 2013-05-02 13:30:32