我有两个表,看起来像这样(这是我实际拥有的一个示例)。
表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如何执行操作的更一般的问题。
发布于 2012-02-24 03:27:21
这取决于表的声明顺序和wheres的顺序。在本例中,where是随后执行的。因此,以相反的顺序声明这些表会更有效,因为您有用于table1的where子句。
这样做的方法是,使用on-子句将table1中的所有行与table2中的行连接起来。最后,在连接的结果上使用where子句。但是,如下所示:
select avg(Value2) v2
from table1
left join table2 on (year(dte)=yr)
where Value>1
group by ID;where子句首先在table1上执行,然后使用on子句执行连接。这是在已经简化的table1版本上完成的,因此效率更高。
https://stackoverflow.com/questions/9419717
复制相似问题