【问题标题】:Transact-SQL shorthand join syntax?Transact-SQL 速记连接语法?
【发布时间】:2010-10-08 03:37:00
【问题描述】:

我在处理遗留代码时注意到几次,您可以使用

在 sql 中进行左右外连接
=*

作为“右外连接”的简写和

*=

在这样的语句中作为“左外连接”的一种简写:

select table1.firstname, table2.lastname
from table1, table2
where table1.id *= table2.id

我猜想对于不同类型的连接,还有像这两个这样的其他运算符,但我还没有找到任何关于它的完整文档。那么你知道任何好的文档链接吗?

我个人认为使用这些运算符的 SQL 语句比使用拼写语法更难理解,那么使用速记版本有什么好处吗?

【问题讨论】:

    标签: sql join


    【解决方案1】:

    =* 和 *= 不符合当前的 SQL 标准,我相信这些运算符很快就会被弃用,您应该始终使用标准的连接语法。您提到的其他运算符令人困惑,需要离开,当我在数据库对象中看到这些时,我感到畏缩。

    【讨论】:

    • 我同意语法有时会令人困惑,但是当您使用旧应用程序时,有时您必须了解一些不酷、过时且有时非常低效的东西。
    • 好点子,我想我真正想建议的是,理想情况下它不应该用在新代码上,但你对理解旧代码的重要性是正确的。
    • 但是当代码错误时——因为这是(=* 或 *= 会给出错误的结果),你应该在看到它时替换它。
    • 这些操作符符合 SQL 标准,仅符合 ANSI 92 SQL 标准 :) 恕我直言,已弃用且不可使用
    【解决方案2】:

    它产生意外后果的原因是它会将 ENTIRE where 子句解释为 JOIN 子句。示例:

    选择1:

    select * from table a left join table b on a.id=b.id
         where b.name = "hello world"
    

    VS

    选择2:

    select * from table a left join table b on a.id=b.id and b.name = "hello world"
    

    这 2 个选择返回不同的结果。当你写这样的语句时:

    select * from tablea,tableb where tablea.id *= tableb.id and b.name="hello world"
    

    我希望大多数人会想要 Select1 的结果...但您实际上会从 Select2 获得结果。

    【讨论】:

      【解决方案3】:

      如果您使用的是 SQL Server,在任何情况下都不要使用该语法。有时会返回不正确的结果,因为有时 SQL Server 将其正确解释为外连接,有时它将该语法解释为交叉连接。由于两者的结果集截然不同,因此您永远不能依赖使用此语法的结果。此外,SQL Server 2008 是最后一个允许使用 sysntax 的 SQL Server 版本。

      【讨论】:

      • 好吧,语法会产生这样的后果,这听起来很可怕!而且我不知道语法会被删除。你有那个公告的链接吗?
      • And from BOL in SQL Server 2000 "在早期版本的 Microsoft® SQL Server™ 2000 中,左右外连接条件是在 WHERE 子句中使用 = 和 =指定的> 运算符。在某些情况下,这种语法会导致不明确的查询,可以用多种方式解释。"
      【解决方案4】:

      我不会使用 *= 或 =(+) 语法,因为它们与其他 RDBMS 不兼容,甚至在 MSSQL Server 与更高版本兼容的情况下,除非您启用低兼容性级别。那么,MS 会在某个时候完全放弃对它的支持,这是一个合理的担忧。

      我花了一些时间来习惯改变我的“旧”习惯。我更喜欢 *= 语法,因为它的输入更少,并且使用更简单的相等连接流程(这仍然完全有效且可以接受)

      我反对使用 JOINS 的原因之一是我在使用它们的查询示例中发现的所有输入和混乱。

      我发现的一些技巧只是格式化问题并知道真正需要什么。 'INNER' 和 'OUTER' 的使用是完全多余和不必要的。我还使用括号来分隔连接子句的结尾,并将每个条件放在自己的行中:

      FROM blah b LEFT JOIN blah2 b2 ON (b.ID = b2.ID)
      LEFT JOIN blah3 b3 ON (b.ID = b3.ID)
      ...
      

      有些人说 ANSI JOIN 语法更难搞砸,因为使用相等连接很容易错过连接参数...实际上我在忘记说“WHERE”时遇到了更多困难,而解释器仍在思考我正在定义连接条件而不是搜索条件,这会导致各种难以找到/奇怪的结果。

      【讨论】:

        【解决方案5】:

        我个人的看法(在 SQL 和 TSQL 工作 6 年多之后)是,这种遗留风格只会让其他不熟悉遗留语法的开发人员更难轻松理解您的代码。如果性能不受影响,我总是更喜欢更冗长和描述性的语法 - 你永远不知道什么时候必须通过该代码的支持:)

        【讨论】:

          猜你喜欢
          • 2017-10-25
          • 2010-09-12
          • 2015-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多