2016-10-10 55 views
0

我有3代表以下數據:順序左聯接表現爲內部連接

materials   customers    sales 
-----------  -----------  -------------- 
    mtrl comp   cust comp  mtrl cust expqty 
    1 2   22 2   1  22  1 
    2 2   23 2   2  22  2 
    3 2   24 2   3  23  3 
    4 2   25 2   4  24  4 

,我想產生如下結果:

mtrl cust expqty 
1  22  1 
2  22  2 
3  22 null 
4  22 null 

在SQL Server中,我使用以下查詢:

select a.mtrl,b.cust,c.expqty from materials a left join customers b on a.comp=b.comp 
left join sales c on c.mtrl=a.mtrl and c.cust=b.cust where b.cust=22 

,雖然我使用的是左連接,我失去了最後的2線和所有我得到的是:

mtrl cust expqty 
    1  22  1 
    2  22  2 

你能告訴我我做錯了什麼,或者我會如何達到預期的效果?

+1

傳統'外部連接'在使用'LEFT JOIN'時''Where'子句中的左表錯誤過濾左表。你需要在'ON'條件下過濾左表記錄 –

回答

2

問題不在於順序連接。問題是where條款。這種情況需要在on條款去:

select m.mtrl, c.cust, s.expqty 
from materials m left join 
    customers c 
    on m.comp = c.comp and c.cust = 22 left join 
    sales s 
    on s.mtrl = m.mtrl and s.cust = c.cust; 

where子句過濾掉NULL值,這是原來的外連接到內連接。請注意,我還修復了表別名,以便它們是表名稱的縮寫。

1

您已在where條款中的b表中輸入條件。將它移動到如下所示的連接條件:

select a.mtrl, 
     b.cust, 
     c.expqty 
from materials a 
left join customers b 
    on a.comp=b.comp and b.cust=22 
left join sales c 
    on c.mtrl=a.mtrl and c.cust=b.cust