我在下面查询了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
答案 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相比,并不容易区分。