为什么要使用相关子查询?
Why to use Correlated Subqueries?
据我所知,可以使用多列子查询或连接重写相关子查询。而且它们通常比相关子查询执行得更好。
那么在哪些可能的情况下,相关子查询可能是更好的选择或唯一的选择?
(我使用 Oracle 数据库)
Oracle 有一个很好的优化器,但相关子查询有时是表达查询的最有效方式。例如:
select t.*,
(select count(*) from z where z.t_id = t.id)
from t;
使用 z(t_id)
上的索引可以非常有效,因为它避免了外部聚合。
还有一些情况既高效又直接转化为一道题:Fetch all the ts that don't exist in z
select t.*
from t
where not exists (select 1 from z where z.id = t.id);
最后,相关子查询只是横向连接的一个例子。横向连接可能非常强大。例如,要获取上一行的所有列,您可以使用:
select t.*, t2.*
from t cross join lateral
(select t2.*
from t t2
where t2.date < t.date
order by t2.date desc
fetch first 1 row only
) t2;
据我所知,可以使用多列子查询或连接重写相关子查询。而且它们通常比相关子查询执行得更好。
那么在哪些可能的情况下,相关子查询可能是更好的选择或唯一的选择? (我使用 Oracle 数据库)
Oracle 有一个很好的优化器,但相关子查询有时是表达查询的最有效方式。例如:
select t.*,
(select count(*) from z where z.t_id = t.id)
from t;
使用 z(t_id)
上的索引可以非常有效,因为它避免了外部聚合。
还有一些情况既高效又直接转化为一道题:Fetch all the ts that don't exist in z
select t.*
from t
where not exists (select 1 from z where z.id = t.id);
最后,相关子查询只是横向连接的一个例子。横向连接可能非常强大。例如,要获取上一行的所有列,您可以使用:
select t.*, t2.*
from t cross join lateral
(select t2.*
from t t2
where t2.date < t.date
order by t2.date desc
fetch first 1 row only
) t2;