分离JOIN和WHERE子句

时间:2011-04-11 17:33:11

标签: sql

我用两种不同的方式写了相同的联接:

select
    one.first,
    two.second,
    three.third
from
    onetable one

    inner join twotable two
        on one.twokey = two.onekey

    inner join threetable three
        on two.twokey = three.twokey
        and one.onekey = three.onekey

where 1=1
    and one.firstnamefield in ('first name', 'second name', 'third name')
    and two.secondnamefield not in ('last name', 'sirname', 'family name')
    and three.thirdnamefield = ('nick name', 'pen name', 'handle')

select
    one.first,
    two.second,
    three.third
from
    onetable one

    inner join twotable two
        on one.twokey = two.onekey
        and one.firstnamefield in ('first name', 'second name', 'third name')
        and two.secondnamefield not in ('last name', 'sirname', 'family name')

    inner join threetable three
        on two.twokey = three.twokey
        and one.onekey = three.onekey
        and three.thirdnamefield = ('nick name', 'pen name', 'handle')

如您所见,第一个WHERE部分进入重写查询中的JOIN

两者之间有什么区别吗?

比另一个更令人满意吗?

3 个答案:

答案 0 :(得分:3)

由于您使用内部联接,因此结果没有区别。但是,如果这些是左连接,结果可能会大不相同。

我倾向于在Join子句中放置与连接相关的条件,并在Where子句中放置与整体过滤相关的条件(我将授予您一个细微的区别)。所以,我的倾向是第一种形式。

答案 1 :(得分:2)

  1. 关于结果集,没有区别。如果您使用的是LEFT JOIN注意到不同的结果。
  2. 是的,更推荐第一个。数据库引擎没有区别,但您不应将过滤器(“where”部分)与连接混合。

答案 2 :(得分:1)

只要你进行等连接(而不是外连接),两者之间就没有功能差异。

一般来说,我更喜欢前一种方法(尽管没有无关的1 = 1条款)。与其他连接语法相比,SQL 92连接语法的一个好处是,它允许您将连接条件与过滤条件分开。您的第一个语句实现了该分离。您的第二个语句结合了连接和过滤条件,使得第一眼看上去更难以确定表彼此之间的关系以及数据的过滤方式。