Tsql 如何使用旧语法进行左连接?

Tsql 如何使用旧语法进行左连接?,tsql,join,left-join,inner-join,outer-join,Tsql,Join,Left Join,Inner Join,Outer 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

如何使用旧语法进行左连接

假设您有一个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
SELECT U.Username, US.[Desc] FROM [User] U
LEFT JOIN UserRole US ON U.UserRoleId = US.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
SELECT U.Username, US.[Desc] FROM [User] U
LEFT JOIN UserRole US ON U.UserRoleId = US.Id
现在,假设所有用户都没有角色,UserRoleId为0或NULL

以下是检索所有用户名和使用旧符号的角色名称的查询:

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
SELECT U.Username, US.[Desc] FROM [User] U
LEFT JOIN UserRole US ON U.UserRoleId = US.Id
问题是:我们如何在不使用JOIN这个词的情况下对旧语法执行相同的操作?

使用加号(+):

+应该放在
WHERE
子句中出现的
LEFT JOIN
右表的任何列上


虽然不建议这样做,但这种形式的语法通常会导致错误,因为它会创建混乱的代码。运算符是
*=
=*
(取决于每列谓词的哪一侧):

但是,自SQL Server 2012以来,这些语法已被弃用,自那时起,24年前停止使用的联接语法就没有向后兼容性。 我不知道你为什么要用这个,但以下是一些让你从黑暗面后退的原因:

或者,如果您想要一种没有连接的替代方式,或者想要专有语法,您可以使用:

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中引入了
左连接
语法,如果您不能将其用于您的数据库,那么是时候更改您的数据库供应商,而不是您的语法了。

为什么………..?非常感谢,即使现在我也一直使用旧的符号,但是由于替代符号看起来非常长,是时候更改了。不
(+)
从未起作用,从2012年起,
*=
也不会起作用。