2010-12-06 27 views
1

我在sql server 2005數據庫中遇到了連接問題。 我有以下表結構:SQL Server:如何使用左外部聯接+依賴內部聯接進行查詢?

TableA --LEFT JOIN--> TableB --INNER JOIN-->TableC 

所以,如果我寫這樣的查詢:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN TableB ON TableA.keyOfB = TableB.key 
INNER JOIN TableC ON TableB.keyOfC = TableC.key 
where TableA.key = aValue 

它讀取0記錄,如果有不TableA記錄相關聯的任何TableB記錄。 但TableB是在外連接,所以這不是我所期望的。換句話說,INNER JOIN不應該考慮因爲沒有任何TableB記錄! 我錯過了什麼?

回答

1

我認爲這與JOIN操作的順序做。 (A LEFT OUTER JOIN B)INNER JOIN C,你想要一個左外部(B INNER JOIN C)。

試着在裏面放一些()。

或者嘗試重新安排你的連接來。B INNER c右鍵OUTER A地(B INNER C)RIGHT OUTER A.

編輯:什麼,我在想 例:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN (TableB INNER JOIN TableC ON TableB.keyOfC = TableC.key) 
ON TableA.keyOfB = TableB.key 
WHERE TableA.key = aValue 

翻轉至右外:

SELECT TableA.* FROM TableB 
INNER JOIN TableC ON TableB.keyOfC = TableC.key 
RIGHT OUTER JOIN TableA ON TableA.keyOfB = TableB.key 
WHERE TableA.key = aValue 

注:請原諒我,如果這是行不通的,因爲版本我沒碰過的SqlServer 7.

1

使用虛擬表進行(B + C)連接。
編輯:是這樣的:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN 
    (select key from TableB INNER JOIN TableC ON TableB.keyOfC = TableC.key) as TableBC 
    ON TableA.keyOfB = TableBC.key 
where TableA.key = aValue 
+0

您可以修改Pier Luigi的代碼,因爲我不確定您的意思嗎? – David 2010-12-06 11:34:19

1

這正是表現爲它應該。與TableC的鏈接是通過TableB,因此如果沒有TableB記錄,鏈接將不會被連接。

更改INNER JOINLEFT OUTER - 雖然它確實是一個內在的,只要有關的數據。

1

如果您在沒有INNER JOIN的情況下運行查詢,那麼所有帶有TableB.key的記錄都將爲空,對吧?所以下一個INNER JOIN找不到任何匹配的記錄,這就是爲什麼沒有結果。

0

下面是代碼,作爲對錶b和c使用左外連接的示例。

declare @TableA table (Adata1 char(2), Adata2 char(2)) 
declare @TableB table (Bdata1 char(2), Bdata2 char(2)) 
declare @TableC table (Cdata1 char(2), Cdata2 char(2)) 

;Insert @TableA 
Select 'A', 'A' union all 
Select 'B', 'B' union all 
Select 'C', 'C' 

;Insert @TableB 
Select 'Ab', 'Ab' union all 
Select 'B', 'B' union all 
Select 'C', 'C' 

;Insert @TableC 
Select 'A', 'A' union all 
Select 'B', 'B' union all 
Select 'Cb', 'Cb' 

--Select * From @TableA 
--Select * From @TableB 
--Select * From @TableC 

Select * from @TableA 
LEFT OUTER JOIN @TableB on Adata1 = Bdata1 
LEFT OUTER JOIN @TableC on Bdata1 = Cdata1 

結果是:

Adata1 Adata2 Bdata1 Bdata2 Cdata1 Cdata2 
A   A NULL NULL NULL NULL 
B   B B B B B 
C   C C Cb NULL NULL