2014-01-18 167 views
0

我有3個表,dbo.employees,dbo.cars,dbo.hours。我基於另一個檢索三個表格。 dbo.mployees總是有一行顯示。 dbo.cars有時取決於員工,dbo.hours有時取決於汽車。TSQL左連接:無論匹配顯示結果

SELECT   e.*, c.*, h.* 
FROM   dbo.emploees e 
LEFT JOIN  dbo.cars c ON e.id=c.employeeID 
LEFT JOIN  dbo.hours h ON c.id=h.carID 
WHERE   c.name='Honda City' 
ORDER BY  e.id ASC; 

我想向所有員工展示。如果在汽車上有匹配,則顯示汽車值,否則顯示空值。如果存在匹配,則顯示它們,否則爲空值。

如果在所有三張桌子上都有匹配的情況下,我所做的說明非常有效,當它沒有顯示任何內容時。根本沒有僱員。

+0

適用於我。只有當我得到你的結果時,沒有一個沒有汽車的員工。 –

+0

在我嘗試使它儘可能漂亮和簡單,我拿出原來的職位在哪裏條件。我將它添加回來。 – user1695981

+0

那麼你的嘗試使查詢變得非常有趣,它完成了一個完全不同的查詢,它確實有效! –

回答

3

您的數據必須存在一些其他問題,因爲您的查詢工作得很好。請點擊這裏演示

SQL Demo

如果要篩選記錄左連接,那麼你需要在join clause添加條件如下圖所示。如果您在where clause中添加過濾條件,那麼它將過濾整個結果,因此它不會返回汽車名稱爲空的其他僱員。 where clause的條件適用於inner join,但不適用於left join

SELECT   e.*, c.*, h.* 
FROM   dbo.employees e 
LEFT JOIN  dbo.cars c ON e.id=c.employeeID AND c.name='Honda City' 
LEFT JOIN  dbo.hours h ON c.id=h.carID 
ORDER BY  e.id ASC; 
+0

U're right。我拿出了「WHERE」條件(編輯它再次),我想這就是爲什麼它的工作原理,如果我要添加WHERE c.name ='本田城市',它不會顯示所有員工,我怎樣才能解決這個問題? – user1695981

+0

檢查我更新的答案 –

0
SELECT e.*, ch.* 
FROM dbo.employees e 
LEFT JOIN  
(
Select c.*, h.* 
From dbo.cars c 
LEFT JOIN dbo.hours h ON c.id=h.carID 
WHERE c.name='Honda City' 
) ch 
ON e.id = ch.employeeID 

ORDER BY e.id ASC; 

只要你添加的where子句都沒有車命名的本田城市的員工得到了過濾掉。

+0

你確定這是你想要的嗎?任何不是本田市汽車的員工也將被退回。 –

0

如果你想顯示誰要麼沒有車本田思迪所有員工,你將需要有標準的WHERE子句中:

SELECT   e.*, c.*, h.* 
FROM   dbo.emploees e 
LEFT JOIN  dbo.cars c ON e.id=c.employeeID 
LEFT JOIN  dbo.hours h ON c.id=h.carID 
WHERE   c.name='Honda City' OR c.ID IS NULL 
ORDER BY  e.id ASC; 

如果你想顯示所有僱員(不分車型),以及只有顯示該車的細節和時間,當汽車處於一個本田思迪,你應該有JOIN子句中的標準:

SELECT   e.*, c.*, h.* 
FROM   dbo.emploees e 
LEFT JOIN  dbo.cars c ON e.id=c.employeeID AND c.name='Honda City' 
LEFT JOIN  dbo.hours h ON c.id=h.carID 
ORDER BY  e.id ASC;