我有两个看起来像这样的表(这是我实际拥有的一个例子)。
表1:
Yr, Value
1990, 1
1990, 2
1991, 2
1992, 3
表2:
Dte, Value2, ID
1/1/1990, 10, 1
1/2/1990, 11, 1
1/3/1990, 12, 2
1/1/1991, 20, 1
1/2/1991, 21, 2
我想首先使用左连接加入这两个表,然后从连接集中丢弃一些值,然后按ID
分组。我写的代码看起来像这样:
select avg(Value2) v2
from table2
left join table1 on (year(dte)=yr)
where Value>1
group by ID;
首先执行连接,然后where
语句中的过滤条件丢弃合并表中的行,或者首先评估where条件,然后再加入连接?上面的示例仅用于说明,这是关于SQL如何执行操作的更一般的问题。
答案 0 :(得分:3)
这取决于您的表格的顺序和where
的顺序。在这种情况下,之后执行的地方。因此,以相反的顺序声明表会更有效,因为你有table1的where子句。
你这样做的方式,table1中的所有行都使用on-clause与table2中的行连接,以缩小它。然后,最后,在连接的结果上使用where子句。但是,像这样:
select avg(Value2) v2
from table1
left join table2 on (year(dte)=yr)
where Value>1
group by ID;
首先在table1上执行where子句,然后使用on-clause执行连接。这是在已经减少的table1版本上完成的,因此效率更高。