SQL内部联接。 ON条件vs WHERE子句

时间:2012-06-22 14:20:42

标签: sql sql-server

我正忙着使用旧样式语法将查询转换为新的连接语法。我的查询的本质如下:

原始查询

SELECT i.*  
FROM 
  InterestRunDailySum i, 
  InterestRunDetail ird, 
  InterestPayments p
WHERE 
   p.IntrPayCode = 187
   AND i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode
   AND ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode

新查询

SELECT  i.*
  FROM InterestPayments p
    INNER JOIN InterestRunDailySum i 
      ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode)
    INNER JOIN InterestRunDetail ird 
      ON (ird.IntRunCode = p.IntRunCode AND ird.IntRunCode = p.IntRunCode)
  WHERE 
    p.IntrPayCode = 187

在此示例中,“原始查询”返回46行,其中“新查询”返回超过800

有人可以向我解释一下这个区别吗?我会假设这些查询是相同的。

2 个答案:

答案 0 :(得分:18)

问题在于您加入InterestRunDetail。您将加入IntRunCode两次。

正确的查询应该是:

SELECT  i.*
  FROM InterestPayments p
    INNER JOIN InterestRunDailySum i 
      ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode)
    INNER JOIN InterestRunDetail ird 
      ON (ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode)
  WHERE 
    p.IntrPayCode = 187

答案 1 :(得分:5)

“新查询”是与JOIN的当前ANSI SQL标准兼容的版本。

此外,我发现查询#2多更清洁

  • 您几乎被迫考虑并指定两个表之间的加入条件 - 您不会在查询中意外地拥有笛卡尔积。如果您恰好列出了十个表格,但WHERE条款中只有六个加入条件 - 您会比预期更多更多数据!

  • 您的WHERE子句不会因连接条件而变得混乱,因此它更干净,更简洁,更易于阅读和理解

  • 你的JOIN的类型INNER JOINLEFT OUTER JOINCROSS JOIN)通常更容易看到 - 因为你拼写它出。使用“旧式”语法,这些连接类型之间的差异很难看到,隐藏在许多WHERE条件中......

在功能上,两者是相同的 - #1可能迟早会被某些查询引擎弃用。

另请参阅Aaron Bertrand的精彩Bad Habits to Kick - using old-style JOIN syntax博客文章以获取更多信息 - 当您正在阅读时 - 阅读所有“不良习惯来发帖” - 非常值得!