我们如何使用旧语法进行 LEFT JOIN?
How do we do LEFT JOIN with old syntax?
我们如何使用旧语法进行 LEFT JOIN?
假设您有一个 User table 和 UserRole table,并且您在 User table 中持有 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 一词的情况下使用旧语法做同样的事情?
使用加号 (+) :
SELECT U.Username, US.[Desc] FROM [User] U, UserRole US
WHERE U.UserRoleId = US.Id(+)
+ 应放在 WHERE
子句中出现的 LEFT JOIN
右侧 table 的任意列。
尽管不建议这样做,但这种形式的语法通常会因为它创建的代码混乱而导致错误
运算符是*=
和=*
(取决于每列在谓词的哪一边):
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 中引入的,如果您不能将它用于您的数据库,那么是时候更改您的数据库供应商,而不是您的语法了。
我们如何使用旧语法进行 LEFT JOIN?
假设您有一个 User table 和 UserRole table,并且您在 User table 中持有 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 一词的情况下使用旧语法做同样的事情?
使用加号 (+) :
SELECT U.Username, US.[Desc] FROM [User] U, UserRole US
WHERE U.UserRoleId = US.Id(+)
+ 应放在 WHERE
子句中出现的 LEFT JOIN
右侧 table 的任意列。
尽管不建议这样做,但这种形式的语法通常会因为它创建的代码混乱而导致错误
运算符是*=
和=*
(取决于每列在谓词的哪一边):
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 中引入的,如果您不能将它用于您的数据库,那么是时候更改您的数据库供应商,而不是您的语法了。