2016-11-23 55 views
2

我們如何使用舊的語法做LEFT JOIN?我們如何使用舊的語法做LEFT JOIN?

比方說,你有一個用戶表和UserRole表,並且你在User表中保存了UserRole的ID。

這裏是獲取所有用戶名查詢,並用新符號的角色名:

SELECT U.Username, US.[Desc] FROM [User] U 
INNER JOIN UserRole US ON U.UserRoleId = US.Id 

這裏是舊符號:

SELECT U.Username, US.[Desc] FROM [User] U, UserRole US 
WHERE U.UserRoleId = US.Id 

現在,讓我們假設所有用戶沒有角色,UserRoleId是0或NULL。

這裏是獲取所有用戶名查詢,以及角色名稱與舊符號:

SELECT U.Username, US.[Desc] FROM [User] U 
LEFT JOIN UserRole US ON U.UserRoleId = US.Id 

的問題是:我們如何做舊的語法相同,不使用這個詞加入?

+2

爲什麼...........? – mellamokb

回答

4

的操作符是*==*(取決於謂詞的側上的每個列是)創建亂碼:

SELECT U.Username, US.[Desc] 
FROM [User] U, UserRole US 
WHERE U.UserRoleId *= US.Id 

自SQL Server 2012以來,這些已被棄用,從那時起,對於24年前停止使用的連接語法沒有向後兼容性。 我不知道爲什麼你可能想利用這一點,但這裏有一些理由來動搖你從黑暗的一面背:

Bad habits to kick : using old-style JOINs

或者,如果你想要一個可替代的方式,而不加入,或專有語法你可以使用:

SELECT U.Username, US.[Desc] 
FROM [User] U, UserRole US 
WHERE U.UserRoleId = US.Id 
UNION ALL 
SELECT U.Username, NULL 
FROM [User] U 
WHERE NOT EXISTS (SELECT 1 FROM UserRole US WHERE U.UserRoleId = US.Id); 

但再次,何苦中,LEFT JOIN語法引入在ANSI 92,如果你不能與你的數據庫中使用它,現在是時候改變你的數據庫供應商,而不是你句法。

+0

我想知道爲什麼我從來沒有聽說過'(+)'語法... – mellamokb

+0

非常感謝,我甚至現在總是使用舊的符號,但是由於替代方法看起來非常長,現在是時候改變了。 –

+1

所以'(+)'不適用於SQL-Server? – sagi

3

使用加號(+):

SELECT U.Username, US.[Desc] FROM [User] U, UserRole US 
WHERE U.UserRoleId = US.Id(+) 

的+應放在出現的WHERE子句中的LEFT JOIN的右表中的任一列。

雖然 - 這不建議的,這種形式的語法的通常會導致錯誤,由於它