=* 的意思是什么?

58

我正在尝试跟踪 Microsoft Server 中的一些 SQL。我遇到了一个使用我不熟悉约定的连接(join)。"=*" 是什么意思?

WHERE table1.yr =* table2.yr -1

47
请用新的SQL语法重新编写我! - KM.
5
如果你足够老,还记得语法结构的话... - OMG Ponies
31
他发送了一个吻给你。 - Samuel Carrijo
11个回答

71

这个:

WHERE t.column =* s.column

这是旧的 TSQL(即 SQL Server 2005 之前)外连接语法,不是 ANSI JOIN。

参考:SQL Server 2005 Outer Join Gotcha


10
从技术上讲,这是指SQL Server 7之前的版本。 - Dave
1
另外,自从SQL Server 2012以来,您无法使用此语法,因为它们已经放弃了80版本兼容模式。这是一件好事。 - Dave Markle

26
我相信这是旧语法,表示从table1到table2的外连接条件。
旧风格:
SELECT * FROM table1, table2
WHERE table1.yr =* table2.yr -1

新风格(SQL92):

SELECT * FROM table2 
LEFT OUTER JOIN table1 ON table1.yr = table2.yr - 1

2
实际上,你的示例是不正确的。如果你真的想使用左外连接,那么应该是SELECT * FROM table2 LEFT OUTER JOIN table1 ON table1.yr = table2.yr-1。 - Turismo

16

这是一种用于表达连接的旧式语法


2
@victor hugo 我还是个新手,请多关照。老实说,我先用一行代码试着帮忙了。有趣的是,我无意中发现这种简单问题的回答比那些困难的问题得到更多的赞同。顺便问一下,为什么你要拿这个问题取笑我,而不是那些声望更高、在 Stack Overflow 上注册时间更长的后来者呢? - mjv
@mjv: 我觉得 Vitor 实际上在取笑我。 - OMG Ponies
3
我认为易懂的内容更容易获得声望,因为它比某些深奥的东西更能被人们理解。观众越多,获得更多投票的机会就越大。 - OMG Ponies
@rexem/victor。明白了,我现在懂了。我没有看到rexem对缺乏具体性的第一条评论...哈哈,真有趣,我们被卷入了这场滑稽的竞争中;-) - mjv

11

这意味着代码需要立即替换!这种样式的连接应该是正确连接。不幸的是,有时它会被解释为交叉连接,因此使用这种连接的结果可能不正确。此外,这种语法已被弃用,不能在下一个版本的SQL服务器中使用。


4
给谁给这个帖子点了踩,我说了这句话是因为按照任何标准来看,现有的代码都是有错误的,甚至在SQL Server 2000时代就不能保证正确的结果。它在SQL Server 2000的书籍在线页面上甚至声明这段代码的结果是不稳定的。如果让它留在代码库中将会很冒险而且不专业。 - HLGEM

7

2
这是ANSI SQL92中弃用的旧连接样式。新语法使用INNER和OUTER JOIN,基于表达式而不是等式连接表。

1

使用符号=*代替WHERE子句中的=,可以指定一个??外连接。


请停止给我点踩,右侧的星号表示该侧可以包含空值。这是左外连接。 - alex
“*=是LEFT还是RIGHT OUTER JOIN”这个问题无法回答,因为你可以写成FROM A, B ON A.c *= B.c或 FROM A, B ON B.c *= A.c相同的运算符(*=),但一个是LEFT OUTER JOIN,另一个是RIGHT OUTER JOIN。尽管如此,我认为你错了,*应该放在外部表的列的一侧,而不是内部表。这个争论的道德是这是可怕的语法。我最喜欢HLGEM的答案。 - Steve Kass
我可以告诉你,从实际尝试中(写那个语法真的很难,令人发抖),*= 是左连接。感谢你的美言,史蒂夫。 - HLGEM
好的,我放弃了。没有什么能够击败实际尝试。 - alex
@HLGEM:你说“*=是左连接。那么你是告诉我这些都是左连接吗?(1)SELECT * FROM A JOIN B ON A.k *= B.k; (2)SELECT * FROM A JOIN B ON B.k *= A.k; (3)SELECT * FROM B JOIN A ON A.k *= B.k; (4)SELECT * FROM B JOIN A ON B.k *= A.k; ?? 我不这样认为。你是说对于每个查询,如果去掉*并在JOIN之前添加LEFT OUTER(因为*=表示左连接),那么就可以更新到新语法了吗? - Steve Kass

0
SELECT *
FROM table1, table2
WHERE table1.yr =* table2.yr -1

意思与此相同:

  SELECT *
  FROM
    table2
    LEFT OUTER JOIN
    table1
    ON table1.yr = (table2.yr - 1)

星号语法已经过时, 不符合ANSI标准。

Oracle有一个类似的结构

  WHERE table1.yr (+)= table2.yr

2
实际上,Oracle 语法是相反的。(+) 在内部(或可选)表的一侧,但星号在外部表的一侧。 因此,table1.yr =* table2.yr 将变为 table1.yr(+) = table2.yr。 - Turismo
Bryans和这个答案给出了相反的连接方向,我经常看到这种情况。哪一个是正确的呢?星号在外部连接的哪一侧? *=表示左外连接,=表示右外连接?这就是Sybase关于T-SQL连接的说法:“Transact-SQL外连接使用=命令表示左外连接,而= *命令表示右外连接。” - Eric Brown - Cal

0

说得简单明了。 这是一个SQL-92外连接运算符(更多信息

不要使用它,它非常老旧,但它类似于LEFT JOIN和RIGHT JOIN。 它所做的就是告诉连接的哪一侧是“父”侧,因此该侧的行将首先被考虑。

如果您尝试在SQL 2005上运行此操作,它会抛出一个错误,提示您需要以兼容模式运行此操作。


0

没错,这是左外连接的另一种语法

从
table1 左外连接 table2 on table1.yr = table2.yr - 1

这是右外连接的另一种语法:从table2右外连接table1 on table1.yr = table2.yr - 1 - Steve Kass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接