t-sql最喜欢的连接方式

时间:2012-03-30 15:41:17

标签: sql tsql

我在下面查询了2个sql。获取table1.date>的最佳方法是什么? 0

选项1:

    select table1.id,table2.firstname, table2.lastname
    from table1 join table2 on table1.id = table2.id and table1.date > 0

选项2:

    select table1.id,table2.firstname, table2.lastname
    from table1 join table2 on table1.id = table2.id where table1.date > 0

6 个答案:

答案 0 :(得分:5)

我发现第二个选项更容易,因为它更清晰,我知道数据正在被WHERE子句过滤。

答案 1 :(得分:3)

总是使用第二个选项。

对于INNER JOIN,这些是等效的。

对于OUTER JOIN,这两个版本将返回不同的结果集!

如果您将该过滤条件放在ON的{​​{1}}条件中,则会在应用OUTER JOIN之前过滤掉记录(而不是之后),这可能会给您带来意想不到的结果

答案 2 :(得分:1)

我会选择选项2,最好是连接值,然后在where子句中排除不需要的值。

答案 3 :(得分:0)

Select 
    table1.id, table2.firstname, table2.lastname 
FROM table1 
INNER JOIN table2 ON table1.id = table2.id 
WHERE table1.date > 0

应该工作。

答案 4 :(得分:0)

不是问题,而是在外部联接中,哪里可以有所作为。

请考虑以下事项。 第二个返回docSVsys中的所有行,但首先不返回。 基本上将外部联接转换为常规联接的位置。

    select COUNT(docSVsys.sID)
    from docSVsys 
    left outer join docMVtext 
    on docMVtext.sID = docSVsys.sID 
    where docMVtext.fieldID = 130

    select COUNT(docSVsys.sID)
    from docSVsys 
    left outer join docMVtext 
    on docMVtext.sID = docSVsys.sID 
    and docMVtext.fieldID = 130 

我有一些大问题,从哪里拉出条件并导致相同的查询但是查询计划不同。

答案 5 :(得分:-1)

选项2在语法上是正确的,并且工作正常。您正在使用WHERE条件正确应用过滤器。

选项1是正确的,但与选项2相比,并不容易区分。