Transact-SQL速记连接语法?

时间:2009-02-17 17:10:00

标签: sql join

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

在sql中做左右外连接
=*

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

*=

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

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

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

我个人认为我使用这些运算符看到的SQL语句比使用拼写语法时更难以弄清楚,因此使用速记版本有什么好处吗?

5 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

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

选择1:

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

VS

选择二:

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

这两个选择返回不同的结果。当你写这样的陈述时:

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

我希望大多数人都希望Select1的结果...但你实际上会从Select2得到结果。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我个人的观点(在SQL和TSQL中超过6年)之后,这种传统风格只会让那些不熟悉遗留语法的开发人员更难以理解您的代码。我总是喜欢更详细的&如果性能不受影响的描述性语法 - 您永远不知道何时需要通过该代码的支持:)

答案 4 :(得分:1)

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

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

我转向使用JOINS的一个反对意见就是打字和我在使用它们的查询示例中发现的混乱。

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

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

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