我用两种不同的方式写了相同的联接:
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
。
两者之间有什么区别吗?
比另一个更令人满意吗?
答案 0 :(得分:3)
由于您使用内部联接,因此结果没有区别。但是,如果这些是左连接,结果可能会大不相同。
我倾向于在Join子句中放置与连接相关的条件,并在Where子句中放置与整体过滤相关的条件(我将授予您一个细微的区别)。所以,我的倾向是第一种形式。
答案 1 :(得分:2)
LEFT JOIN
,会注意到不同的结果。答案 2 :(得分:1)
只要你进行等连接(而不是外连接),两者之间就没有功能差异。
一般来说,我更喜欢前一种方法(尽管没有无关的1 = 1条款)。与其他连接语法相比,SQL 92连接语法的一个好处是,它允许您将连接条件与过滤条件分开。您的第一个语句实现了该分离。您的第二个语句结合了连接和过滤条件,使得第一眼看上去更难以确定表彼此之间的关系以及数据的过滤方式。