2012-06-22 29 views
7

我忙于将使用旧式语法的查询转换为新的连接语法。我查询的要点如下:SQL内部加入。 ON条件与WHERE子句

原始查询

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

有人能解释一下我的不同吗?我会假设这些查询是相同的。

回答

17

问题是您的加入到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

谢谢凯文,我觉得自己没有发现那个傻瓜! – Russell

+2

它发生在我们所有人身上。 :-) –

4

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

而且,我发现查询#2多清洁

  • 你几乎被迫思考和指定连接两个表之间的条件(S) - 你不小心就会有笛卡儿产品在您的查询中。如果您碰巧列出了十个表格,但在WHERE条款中只有六个连接条件 - 您将获得更多数据比预期的要差!

  • WHERE子句不能与凌乱的连接条件,因此它的清洁,少凌乱,更容易阅读和理解

  • 的类型您的JOIN(是否INNER JOINLEFT OUTER JOINCROSS JOIN)通常是很容易看到 - 因为你拼出来了。随着“旧式”的语法,那些之间的差异连接类型是相当难得一见,某处埋藏在你很多WHERE标准.....

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

另见阿龙贝特朗的优秀Bad Habits to Kick - using old-style JOIN syntax博客帖子获取更多信息 - 虽然你在它 - 阅读所有“坏习惯踢”的帖子 - 大家都非常值得的!

+1

很好的答案 - 但他的查询并不完全相同 - 它看起来只是一个错字;-) –