我是不是将 Ansi OUTER JOIN 语法正确地转换为较旧的 Sybase (*=) 连接语法?

Posted

技术标签:

【中文标题】我是不是将 Ansi OUTER JOIN 语法正确地转换为较旧的 Sybase (*=) 连接语法?【英文标题】:Am I translating Ansi OUTER JOIN syntax correctly to older Sybase (*=) join syntax?我是否将 Ansi OUTER JOIN 语法正确地转换为较旧的 Sybase (*=) 连接语法? 【发布时间】:2010-11-02 14:17:46 【问题描述】:

假设这是 左外连接的正确 Ansi SQL 语法:

SELECT *  
FROM   employee  LEFT OUTER JOIN department  
          ON employee.DepartmentID = department.DepartmentID

这是右外连接的正确Ansi SQL语法:

SELECT * 
FROM   employee RIGHT OUTER JOIN department 
          ON employee.DepartmentID = department.DepartmentID

这是旧的 Sybase 等价于 左外连接

SELECT * FROM employee, department
WHERE employee.DepartmentID *= department.DepartmentID

这是旧的 Sybase 等价于 右外连接

SELECT * FROM employee, department
WHERE employee.DepartmentID =* department.DepartmentID

因此,我们将 * 放在等号的左侧表示左外连接,将 * 放在等号的右侧表示右外连接。

对吗?

【问题讨论】:

【参考方案1】:

*= 等价于左外连接,而 ...=* 等价于右外连接(如您所料)

您可能有兴趣注意,旧版本的 Sybase ASE 不支持 *=*。 Semantics and compatibility of Transact-SQL outer joins 解释原因 (PDF)

【讨论】:

文森特——星号出现了,我希望你不介意我用反斜杠编辑它们【参考方案2】:

是的。但有时这两个在通过 where 处理结果集时可能会有些不同

【讨论】:

【参考方案3】:

是的,没错

【讨论】:

【参考方案4】:

为什么要将左连接转换为旧语法,不应该将旧语法转换为首选的较新标准?我不了解 Sybase,但由于 SQl Server 基于 Sybase,我怀疑它可能存在相同的问题,即旧语法并不总是被正确地解释为外部连接。有时数据库可能会将其解释为交叉连接,因此通常我不建议使用它,除非您访问的是旧版本的数据库,以至于新语法不可用。

【讨论】:

以上是关于我是不是将 Ansi OUTER JOIN 语法正确地转换为较旧的 Sybase (*=) 连接语法?的主要内容,如果未能解决你的问题,请参考以下文章

对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Codin

MySQL OUTER JOIN 语法错误

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

带有子查询语法的 LEFT OUTER JOIN

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)