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

Hak*_*gan 2 t-sql join inner-join left-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
Run Code Online (Sandbox Code Playgroud)

这是旧的符号:

SELECT U.Username, US.[Desc] FROM [User] U, UserRole US
WHERE U.UserRoleId = US.Id
Run Code Online (Sandbox Code Playgroud)

现在,让我们假设所有用户都没有角色,UserRoleId 为 0 或 NULL。

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

SELECT U.Username, US.[Desc] FROM [User] U
LEFT JOIN UserRole US ON U.UserRoleId = US.Id
Run Code Online (Sandbox Code Playgroud)

问题是:我们如何在不使用 JOIN 一词的情况下使用旧语法做同样的事情?

Gar*_*thD 5

运算符是*==*(取决于每列是谓词的哪一侧):

SELECT U.Username, US.[Desc] 
FROM [User] U, UserRole US
WHERE U.UserRoleId *= US.Id
Run Code Online (Sandbox Code Playgroud)

但是,自 SQL Server 2012 以来,这些已被弃用,从那时起,24 年前停止使用的连接语法没有向后兼容性。我不知道你为什么要使用它,但这里有一些理由可以让你从黑暗的一面回来:

要改掉的坏习惯:使用旧式 JOIN

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

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);
Run Code Online (Sandbox Code Playgroud)

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