SQL Server 中的 Oracle 样式联接

Posted

技术标签:

【中文标题】SQL Server 中的 Oracle 样式联接【英文标题】:Oracle Style Joins in SQL Server 【发布时间】:2011-11-24 01:41:59 【问题描述】:

有没有办法在 SQL Server 中进行 oracle 样式的联接?

select * 
from t1, t2
where t1.id = t2.id (+)

编辑

为什么最好使用“左外连接”和“内连接”类型?我发现阅读旧形式更容易,尤其是涉及复杂的表连接时。

【问题讨论】:

old school/unrecommended equivalent for SQL Server would be =*。无论哪种情况,语法都适用于 OUTER 连接。 =* 样式的联接也已被弃用,并且在 SQL Server 2012 中将不再起作用。 旧式连接不明确,可能会根据 WHERE 的应用方式返回不同的结果。这就是它们被逐步淘汰 ANSI SQL 标准以及 SQL Server 弃用它们的原因。 【参考方案1】:

Microsoft 正在使用 ANSI ISO SQL 标准。 Mark Rittman 对ANSI joins and why you should use them 有很好的解释。但是,SQL Server 不支持该文章中列出的 NATURAL JOIN 语法和 ANSI 标准。您可能更熟悉旧的 Oracle 语法,但它是标准并且您会在其他数据库产品中找到。

回答您的问题 - 无法在 SQL Server 上执行 Oracle 样式的联接。甚至 *==* 样式的连接也已被弃用,并且在产品的下一版本中将被完全删除。

【讨论】:

【参考方案2】:
SELECT *
FROM t1
LEFT OUTER JOIN t2 ON t1.id = t2.id

这篇AskTom 文章向您展示了 Oracle 的从 (+) 到 (LEFT AND RIGHT) OUTER JOIN 的语法等效项,而 SQL Server 使用 OUTER JOIN 语法。

【讨论】:

以上是关于SQL Server 中的 Oracle 样式联接的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2000 或 2005 中的联接

SQL Server-外部联接基础回顾(十三)

我可以将 PIVOT 与 Microsoft SQL Server 中的内部联接结合起来吗?

调整SQL Server中的大型查询

SQL Server-交叉联接内部联接基础回顾

列结果略有不同时的 SQL (Oracle) 联接