我正忙着使用旧样式语法将查询转换为新的连接语法。我的查询的本质如下:
原始查询
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
有人可以向我解释一下这个区别吗?我会假设这些查询是相同的。
答案 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 JOIN
,LEFT OUTER JOIN
,CROSS JOIN
)通常更容易看到 - 因为你拼写它出。使用“旧式”语法,这些连接类型之间的差异很难看到,隐藏在许多WHERE
条件中......
在功能上,两者是相同的 - #1可能迟早会被某些查询引擎弃用。
另请参阅Aaron Bertrand的精彩Bad Habits to Kick - using old-style JOIN syntax博客文章以获取更多信息 - 当您正在阅读时 - 阅读所有“不良习惯来发帖” - 非常值得!