2012-04-13 88 views
3

我想知道以下查询(使用两种不同的联接语法)之间的区别是什么。我在一些我继承的代码中看到了这一点,并且好奇如果结果总是相同的。如果没有,为什么你会使用一个在另一个。两个TSQL联接有什么区别?

查询#1实施例:

SELECT * FROM TableA a 
    INNER JOIN TableB b 
    INNER JOIN TableC c 
     ON b.TableBId = c.TableCId 
    ON b.TableBId = a.TableAId 

查询#2实施例:

SELECT * FROM TableA a 
    INNER JOIN TableB b 
    ON b.TableBId = a.TableAId 
    INNER JOIN TableC c 
    ON b.TableBId = c.TableCId 
+3

看看执行计划是否有差异。 – 2012-04-13 20:07:44

+0

您确定#1是有效的SQL。根据http://msdn.microsoft.com/en-us/library/ms177634.aspx我看不出如何工作。 – Alex 2012-04-13 20:12:16

+3

@Alex是的,那是有效的SQL。这里是小提琴显示没有执行错误:http://sqlfiddle.com/#!3/b00427/1 – 2012-04-13 20:15:13

回答

2

正如已经说过,您可以查看execution plans验证这些确实是相同的查询。我几乎可以肯定,他们是,虽然

更多你的,你为什么会选择一个比其他问题。我会说这归结于风格偏好。大多数情况下,您会看到#2号查询,因为它对未来的读者有更清晰的定义。如果你创建了一个真正复杂的查询,那么你获得的好处就会大大增加。

我真的不能担保的其他方法,因为我真的相信它变得太不可读和不应该被使用。同样,这是我的观点,推论归结为意见/风格。

然而,标准的方式是QUERY2,所以我会与坚持:)...但同样,只是我

+0

“标准方式是query2” - 两个查询都符合SQL标准(并且在语义上相同)。 – onedaywhen 2012-04-16 09:49:18

+0

@onedaywhen标准在行业标准。是的,两者都是SQL标准版,但很少有开发人员以写入query1的方式编写它 – 2012-04-16 16:36:37

0

您的查询的执行计划是完全一样的。