我们如何使用旧语法进行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这个词?
答案 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
右表的任意列上。
虽然 - 这没有建议,但这种语法形式通常会因为它创建的代码混乱而导致错误