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

Posted

技术标签:

【中文标题】我们如何使用旧语法进行 LEFT JOIN?【英文标题】:How do we do LEFT JOIN with old syntax? 【发布时间】:2017-04-07 16:51:20 【问题描述】:

假设您有一个 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 的情况下对旧语法做同样的事情?

【问题讨论】:

为什么......? 【参考方案1】:

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

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

【讨论】:

非常感谢,即使现在我也一直使用旧的表示法,但是由于替代方案看起来非常长,是时候改变了。 不,(+) 从未工作过,从 2012 年起,*= 也将无法工作。【参考方案2】:

使用加号(+):

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

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

虽然 - 不建议这样做,但由于它创建的代码混乱,这种语法形式通常会导致错误

【讨论】:

以上是关于我们如何使用旧语法进行 LEFT JOIN?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Entity Framework Core 2.0 上的 lambda 语法在 LINQ 中实现 LEFT OUTER JOIN?

如何使用 $lookup MongoDB 进行 LEFT JOIN

LEFT JOIN 或 REGULAR JOIN,以及如何将 MySql 表与数组进行比较?需要表现!

如何根据列值与没有关联的表进行 LEFT JOIN

如何在 Teradata SQL 中使用 LEFT JOIN 对查询中的非聚合参数进行 GROUP BY?

如何在 MySQL LEFT JOIN 中使用别名