sql - 为什么要使用相关子查询?

标签 sql oracle oracle11g sqlperformance sql-tuning

据我所知,相关子查询可以使用多列子查询或联接来重写。而且它们通常比相关子查询表现得更好。

那么在哪些可能的情况下,相关子查询可能是更好的选择或唯一的选择? (我使用Oracle数据库)

最佳答案

Oracle 有一个很好的优化器,但相关子查询有时是表达查询的最有效方式。例如:

select t.*,
       (select count(*) from z where z.t_id = t.id)
from t;

使用 z(t_id) 上的索引可以非常高效,因为它避免了外部聚合。

还有其他一些情况,它们既高效又直接转化为一个问题:获取 z 中不存在的所有 ts。

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;

关于sql - 为什么要使用相关子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65039247/

相关文章:

SQL 回车

oracle - 使用 select 在其他模式 oracle 中创建表

select - 如何列出可通过数据库链接访问的表?

mysql - 从多个表中选择 - 一对多关系

sql - 从时间戳列中删除时间部分

mysql - 带 ROUND 和除法的 sql 查询

c - Oracle 11g 中 rowid 的长度是固定的吗?

mysql - 使用 sql、codeigniter 统计 8 年级男女学生总数

php - Oracle 数据库连接总是丢失 DRCP 缓存

mysql - 如何识别并更新一半的重复记录