2017-07-19 41 views
0

我有3個表:的SQL Server:查詢權加入

用戶:

Oid | email | pass 

距離:

Oid | Name | Users 

CS:

Oid | Name | Users | Dist 

我想帶所有的用戶以及CS的名稱和Dist的名稱,如果是這樣的話。

這是我的嘗試:

SELECT 
    Users.*, CS.OID as OidCS, CS.Name as NameCs, 
    Dist.OID as OidDist, Dist.Name as NameDist 
FROM 
    Dist, Users 
RIGHT JOIN 
    CS on CS.Users = Users.OID 
WHERE 
    CS.Dist = Dist.OID 

但此查詢不給我帶來的DIST用戶,我需要他們兩個(Cs和DIST),我不知道如何爲解決的途徑,我該如何解決它?

謝謝。

+0

提示:'從用戶...左加入DIST ....左連接CS ...' – scsimon

+7

請不要混淆隱性和顯性加盟句法。它會導致極其奇怪的問題。作爲一個經驗法則,您應該從不*在FROM子句中使用逗號。 – Siyual

回答

2

您正在將一個古老的隱含JOIN語法(已棄用over 25 years)與一個明確的語法混合使用。這會導致您的結果出現一些問題。

作爲一個經驗法則,您應該永不FROM條款中有,。你應該總是使用明確的JOIN語法。

在這種情況下,使用LEFT JOIN更具邏輯意義。您希望從Users中選擇所有內容,並從DistCS中選擇記錄(如果存在)。

這應該得到你所需要的:

Select  U.*, C.OID As OIDCS, C.Name As NameCs, 
      D.OID As OIDDist, D.Name As NameDist 
From  Users U 
Left Join CS  C On U.OID = C.Users 
Left Join Dist D On D.OID = C.Dist 
+0

我認爲這將基於'D.User = U.OID'基於這個邏輯或全部在OID上。當然,從OP中很難分辨出來。但我認爲這會拋出c.Dist無法綁定的錯誤,不是嗎?這意味着我們需要改變連接的順序。 – scsimon

+1

@scsimon嗯,訂單很好。我沒有注意到這一點 – Siyual

-2

可能是在你的sql語法中有一個問題,你正在使用表名稱作爲這樣的匹配。

WHERE CS.Dist = Dist.OID。

CSDIST也是你在這裏使用賦值運算符,你必須更新邏輯表比較這裏不是兩個表的表列。

明白了嗎?

+1

這不是它的工作原理... – Siyual

+0

可以請你分享我們如何在查詢中只寫一個左連接? –

+1

我不確定你在問什麼,但我在我的答案中有'Left Join's,如果這就是你想要的.. – Siyual