我们如何使用旧语法进行LEFT JOIN?

时间:2016-11-23 15:37:39

标签: tsql join left-join inner-join outer-join

我们如何使用旧语法进行LEFT JOIN?

假设您有一个User表和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

问题是:我们如何使用旧语法,而不使用JOIN这个词?

2 个答案:

答案 0 :(得分: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);

但是再一次,为什么麻烦,ANSI 92中引入了LEFT JOIN语法,如果你不能在数据库中使用它,那么是时候改变你的数据库供应商了,而不是你的语法。

答案 1 :(得分:3)

使用加号(+):

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

+应放在LEFT JOIN子句中显示的WHERE右表的任意列上。

虽然 - 这没有建议,但这种语法形式通常会因为它创建的代码混乱而导致错误