2012-12-12 51 views
3

如果我有查詢:加入時的行爲表沒有使用加入自己的密鑰

SELECT * 
FROM Table1 a 
Inner Join Table2 b on a.Key = b.Key 
Inner Join Table3 c on a.Key = b.Key 

這是怎麼回事?我最近在一些代碼中發現了這個錯誤(想要在a.Key = c.Key上加入c),並且當我發現並修復它時,我很驚訝它允許執行並獲得結果。

我很好奇,當調用這樣的查詢時會發生什麼。據我所知,它執行(table1 join table2)和table3之間的交叉連接?

+2

因爲它是一個*條件總是爲真*,所以它相當於'SELECT * FROM Table1 a.Key = b.Key Inner Join Table3 c on 1 = 1'上的Inner Join Table2 b,例如笛卡爾(t1加入t2)* t3的乘積。 – wildplasser

+1

是的,它在這種情況下有效地進行CROSS JOIN。它允許這樣做,因爲它允許ON子句中的任何一組邏輯條件,並且假定這是有意的。 (這很好,因爲有些案例和技巧可以利用這一點)。 – RBarryYoung

+0

@wildplasser。 。 。你是對的。你應該把它作爲答案。 –

回答

4

由於是永遠滿足的條件,它相當於:

SELECT * FROM Table1 a 
Inner Join Table2 b on a.Key=b.Key 
Inner Join Table3 c on 1=1 
    ; 

,例如笛卡爾乘積(T1 T2加入)* T3。