[SQL] 将子查询改写成hash join
Posted adream307
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SQL] 将子查询改写成hash join相关的知识,希望对你有一定的参考价值。
这个是当时给新员工做培训时,我认为最难的一条 SQL
语句
原始 SQL
语句
select A.a1
from A
where A.a2 > (
select max(B.b1)
from B
where B.b2= A.a3
);
很多人看到这条语句时,表示不知道这条语句在干什么,这里简单解释一下:
- 从表
A
中取出一行,记为ax1
,ax2
,ax3
- 根据
ax3
的值,在表B
中删选出所有满足B.b2==ax3
- 在第
2
步筛选出的表B
的所有行中,选出B.b1
的最大值,记为maxB1
- 根据第
1
步筛选出的ax2
和maxB1
值如果ax2 > maxB1
则输出当前的ax1
,否则不输出任何东西 - 在从表
A
中取出下一行数据,再次按照 步骤1,2,3,4 计算一次
简单说就是表A
中每一行数据都需要在表B
中做一次筛选,然后再比较筛选出的 max(B.b1)
改写后的 SQL
语句
create view C(c1, c2) AS
select B.b2,max(B.b1) from B group by B.b2;
select A.a1 from A,C
where A.a3=C.c1 and A.a2 > C.c2;
以上是关于[SQL] 将子查询改写成hash join的主要内容,如果未能解决你的问题,请参考以下文章