2013-04-25 45 views
4

這是SQL Server顯然正確的語法:如何在SQL select語句中使用逗號分隔表的列表時如何執行連接?

SELECT a.id, b.name 
FROM Table1 a, Table2 b 
WHERE a.id = b.fk1 

所以是這樣的:

SELECT a.id, c.status 
FROM Table1 a 
JOIN Table3 c ON a.id = c.fk2 

但是,這顯然不是:

SELECT a.id, b.name, c.status 
FROM Table1 a, Table2 b 
JOIN Table3 c ON a.id = c.fk2 
WHERE a.id = b.fk1 

通常我不會想構建第三種情況下的查詢(實際上不是第一種情況),但它可能是編輯已寫入代碼的最小阻力路徑我的公司。有人用第一種形式使用五個不同的表格,我真的需要通過JOIN語句在第六個表格中工作,而不會冒着弄亂他們已有的東西的機會。儘管如果我需要,我可以徹底重新編寫他們的東西,但我真的很想知道如何在第三種情況下做類似的事情。

運行代碼完全一樣,在例子中,第三種情況使我這個錯誤消息:

The multi-part identifier "a.id" could not be bound. 

什麼是語法上打破了第三種情況?可以應用什麼簡單的修復?謝謝!

+0

阻力最小的路徑不一定是最好的路徑。 – 2013-04-25 16:10:33

回答

1

此代碼:

SELECT a.id, b.name, c.status 
FROM Table1 a, Table2 b 
JOIN Table3 c ON a.id = c.fk2 
WHERE a.id = b.fk1 

正在做a交叉聯接和內連接的結果上bc。因爲加入正在對b執行的c不能訪問任何字段中a。你應該做的是改變你的查詢爲:

SELECT a.id, b.name, c.status 
FROM Table1 a 
    inner join Table2 b on a.id = b.fk1 
    inner JOIN Table3 c ON a.id = c.fk2 
2

我,同樣,不會建議這樣做。但是,您可以將,更改爲cross join

SELECT a.id, b.name, c.status 
FROM Table1 a cross join Table2 b 
JOIN Table3 c ON a.id = c.fk2 
WHERE a.id = b.fk1 
相關問題