[英]Joining two tables together with two foreign keys
我有一個描述表,其中包含某些描述以及唯一的ID。 我有另一個表包含此表的兩個外鍵。 到目前為止,我有以下查詢:
SELECT
Description.description AS Description,
Object.objID AS ID,
Description.description AS Location
FROM
Object
INNER JOIN
Description
ON
Object.objDescID=Description.descID
AND
Object.objLocID=Description.descID;
但是這不起作用,請有人指出我正確的方向嗎?
如果我理解正確,您想要為同一個對象加入兩次Description表。 給它一個鏡頭,看看它是否能讓你得到你想要的東西:
SELECT
Object.objID AS ID,
od.description AS Description,
ld.description AS Location
FROM Object
INNER JOIN Description AS od
ON Object.objDescID=od.descID
INNER JOIN Description AS ld
ON Object.objLocID=ld.descID;
編輯:一個建議,如果你允許空外鍵你應該使用LEFT JOIN而不是INNER JOIN,這樣如果其中一個為null,它不會保持整個記錄不顯示。
嘗試運行此功能(可能需要稍作調整):
SELECT
Description.description AS Description,
Object.objID AS ID,
Description.description AS Location
FROM
Object
INNER JOIN
Description AS Object.objDescID=Description.descID
INNER JOIN
Description AS Object.objLocID=Description.descID;
看起來您需要兩個對Description
表的引用。 每個引用將使用一個外鍵列連接。
例如:
SELECT o.objID AS `ID`
, d.description AS `Description`
, l.description AS `Location`
FROM Object o
JOIN Description d
ON d.descID = o.objDescID
JOIN Description l
ON l.descID = o.objLocID
我們將短別名d
分配給我們從中獲取Description
值的源。
我們將短別名l
分配給我們從中獲取Location
值的源。
我們使用短別名而不是表名來引用每個表中的列。
從本質上講,考慮對Description
表的引用,就像它是兩個不同的表,即使它實際上是同一個表。
請注意,我們必須為至少一個對Description的引用分配一個別名,以便我們可以區分它們。 (否則,如果我們只是說Description.description
,MySQL將不知道我們正在談論哪一個。)
請注意,如果外鍵列objDescID
或objLocID
具有NULL值,或者引用的表中不存在匹配值,則查詢將不會從Object返回該行。
為了確保即使找不到匹配值也從Object獲取一行,您可以通過包含LEFT
關鍵字來使用OUTER
連接操作。
例如:
SELECT o.objID AS `ID`
, d.description AS `Description`
, l.description AS `Location`
FROM Object o
LEFT
JOIN Description d
ON d.descID = o.objDescID
LEFT
JOIN Description l
ON l.descID = o.objLocID
請注意,實際上只需要一個別名,但我傾向於為查詢中的所有行源分配短別名。 這使得語句更難以辨認,如果我以后需要添加對已經使用的表的另一個引用,或者我需要用不同的表名或內聯視圖(或子查詢)替換其中一個表名,這確實很有幫助。 ,我可以保留別名相同,只更改rowsource。 其他別名在語句的實際執行中沒有任何區別,它們就在那里,因為我遵循相同的模式來處理我為更復雜的查詢所遵循的簡單查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.