条款和AND条款之间的数据差异

时间:2015-11-30 11:23:40

标签: sql sql-server tsql

我在我们的应用程序中尝试了这些查询。每个都为我返回了不同的结果集。

查询集1

SELECT * 
FROM TABLE1 T1
LEFT OUTER JOIN TABLE2 T2 ON (T1.ID = T2.ID
                              AND T1.STATUS = 'A'
                              AND T2.STATUS = 'A')
INNER JOIN TABLE3 T3 ON (T2.ID = T3.ID)
WHERE T3.STATUS = 'A'

查询集2

SELECT *
FROM TABLE1 T1
LEFT OUTER JOIN TABLE2 T2 ON (T1.ID = T2.ID
                              AND T2.STATUS = 'A')
INNER JOIN TABLE3 T3 ON (T2.ID = T3.ID)
WHERE T3.STATUS = 'A'
  AND T1.STATUS  = 'A'

我无法找出每个查询返回不同输出的原因。另请指导我使用多个joinsleft, right, Inner)Filtering clauses.

时使用哪种方法最佳

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

在第一个

SELECT * 
FROM TABLE1 T1
LEFT OUTER JOIN TABLE2 T2 ON (T1.ID = T2.ID
                              AND T1.STATUS = 'A'
                              AND T2.STATUS = 'A')
INNER JOIN TABLE3 T3 ON (T2.ID = T3.ID)
WHERE T3.STATUS = 'A'

AND T1.STATUS ='A'效果为零 这是一个左连接 - 你需要获得所有的T1期

当您将T1.STATUS ='A'移动到应用的位置时

答案 1 :(得分:0)

您在左连接的右表上放置一个过滤器,创建一个内连接。您的第一个查询将返回较少的结果,而您的第二个查询将在右表中针对不匹配的行进行NULLS。这个链接帮助我更好地理解了连接,因为我很长时间都在努力去理解这个概念。 HERE

如果我的答案不明确,请向我索要修改。

答案 2 :(得分:0)

您的代码中的差异是T1.STATUS ='A'位置。

查询1: 您在所有常见IDS上加入T1和T2表,并且仅当T1.STATUS ='A'= T2.STATUS时才加入。

查询2: 您在所有常见IDS上加入T1和T2表,并且仅在T2.STATUS ='A'

时加入

基本上,查询1:首先过滤T1的数据,然后加入。 查询2:您先加入表格,然后然后过滤已加入表格中的数据。

关于连接,通常左连接和内连接返回相同的结果。看看herehere我发现这两个链接确实很有用。

最后,我个人的偏好是使用内部联接,除非我确实需要左表或右表中的所有行。我相信它使我的查询更容易阅读和维护。

我希望有所帮助。