2014-03-27 167 views
0

我有一個Description表,其中包含某些說明以及一個唯一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; 

但是,這不工作,請有人指出我在正確的方向嗎?

+1

不工作?有些錯誤? –

+0

你最後的'AND'條款需要修復 – SoulTrain

+1

Joe Meyer指出你正確的方向。他的回答基本上與我的一樣。您需要**兩個單獨的引用來描述表。一個引用查詢objDesc,另一個查找objLoc。在描述表的引用之一需要別名的情況下,可以區分它們。 – spencer7593

回答

2

如果我理解正確的,你想加入到說明表兩次相同的對象。給這一個鏡頭,看看它是否讓你你以後:

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,即如果其中一個爲空,它不會保留整個記錄不顯示。

+0

+1。我們需要像處理兩個**不同的**表一樣處理'Description'表;我們從一個獲得objDesc,並從另一個獲得objLoc。 – spencer7593

+0

我現在得到錯誤ERROR 1054(42S22):'on子句'中的未知列'Description.descID' – JH95

+0

更新了查詢以反映on子句中的別名表名 –

-1

我有一種感覺,那是因爲表名

讓這個嘗試的:

SELECT 
D.description AS `Description`, 
O.objID AS `ID`, 
D.description AS `Location` 
FROM 
`Object` O 
INNER JOIN 
Description D 
ON 
O.objDescID=D.descID 
AND 
O.objLocID=D.descID; 
0

嘗試運行這個(可能需要小的調整):

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; 
+0

這是無效的語法。這種方法是正確的,我們需要**兩個**描述表的引用,但是對查詢所做的更改不夠充分,對解釋爲什麼進行更改的解釋很短。 – spencer7593

0

看起來你需要引用到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值。

我們使用短別名而不是表名引用每個表中的列。

從本質上講,儘管它是真正的同一個表,但是它的表格的引用實際上是兩個不同的表格。

請注意,我們必須爲描述的至少一個引用指定一個別名,以便我們可以區分它們。 (否則,MySQL不會知道我們在談論如果我們剛纔說Description.description其中之一。)

注意,如果外鍵列objDescIDobjLocID有一個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 

注意,但我傾向於分配短的別名在查詢所有的行來源。這使得語句更易於辨認,而且如果我以後需要爲已經使用的表添加另一個引用,或者需要用不同的表名或內聯視圖(或子查詢)替換其中一個表名, ,我可以使別名保持不變,並更改行源。其他別名在語句的實際執行中沒有任何區別,它們就在那裏,因爲我遵循相同的模式來進行簡單的查詢,以適應更復雜的查詢。

+0

+1,比我自己的更詳細的解釋 –