2011-05-12 144 views
0

我的表連接和定位有以下欄目:如何多次連接同一個表?

連接:

LocationIDFrom 
LocationIDTo 
Duration 

地點:

LocationID 
LocationName 

的示例記錄如下: 連接:

1, 2, 3ms 
2, 1, 5ms 
1, 5, 12ms 
3, 2, 2ms 

地點:

1, New York 
2, Boston 
3 Los Angeles 

我想顯示的列LocationFrom,LocationTo,持續時間的表。上面記錄的例子是

New York, Boston, 3ms 
Boston, New York, 5ms 
Los Angeles, Boston, 2ms 

我嘗試使用下面的查詢

SELECT l1.LocationName AS LocationFrom, l2.LocationName AS LocationTo, c.Duration 
FROM Connection c 
    INNER JOIN Location l1 ON l1.LocationID= c.LocationIDFrom 
    INNER JOIN Location l2 ON l2.LocationID= c.LocationIDTo 

但結果卻是不完整的;有些行缺少位置詳細信息存儲在位置表中的LocationIDFrom和LocationIDTo。

有誰知道如何修改上面的查詢或寫入正確的返回表的位置名稱必須從同一個表中檢索LocationFrom和LocationTo而不是ID?

Here我找到了類似問題的解決方案,但不知道爲什麼該原理不適用於上述問題。

+1

我不明白如何可能有行丟失。你能詳細說明一下嗎?我假設你具有參照完整性,即連接中的每個位置ID真的存在於位置... – 2011-05-12 14:00:00

+1

您的查詢對我來說是正確的。有沒有哪個位置ID可能是NULL的情況?如果是這樣,你會想使用'LEFT JOIN'而不是'INNER JOIN'。 – 2011-05-12 14:01:19

+0

我的錯!如果所有ID的位置詳細信息存儲在位置表中,則查詢返回正確的結果。我忽略了一個不正確的條目。 – 2011-05-12 14:34:21

回答

5

這是因爲您不能加入ID 5,因爲它不存在。如果您離開外部連接,您將選擇連接,並且不會爲不存在的位置命名。

SELECT isNull(l1.LocationName,'') AS LocationFrom, isNull(l2.LocationName,'') AS LocationTo, c.Duration 
FROM Connection c 
left outer JOIN Location l1 ON l1.LocationID= c.LocationIDFrom 
left outer JOIN Location l2 ON l2.LocationID= c.LocationIDTo 
相關問題