sql - SQL子查询有多少种类型?

标签 sql select subquery common-table-expression

为了理解哪些类型的子查询可以关联,我编写了如下所示的 SQL 查询。它显示了我能想到的 SQL select 语句可以包含的所有类型的子查询。

虽然下面显示的示例在 Oracle 12c 中运行,但我更愿意让这个问题与数据库无关。在下面的示例中,我包含了我能想到的所有 7 种类型的子查询:

with 
  daily_login as ( -- 1. Independent CTE [XN]
    select user_id, trunc(login_time) as day, count(*) from shopper_login
      group by user_id, trunc(login_time)
  ),
  frequent_user as ( -- 2. Dependent CTE [XN]
    select user_id, count(*) as days from daily_login group by user_id
    having count(*) >= 2
  ),
  referrer (frequent_id, id, rid, ref_level) as ( -- 3. Recursive CTE [XN]
    select fu.user_id, s.id, s.ref_id, 1 from frequent_user fu 
      join shopper s on fu.user_id = s.id
    union all
    select r.frequent_id, s.id, s.ref_id, r.ref_level + 1 from referrer r
      join shopper s on s.id = r.rid
  )
select s.id, s.name, r.id as original_referrer,
    ( -- 4. Scalar Subquery [CN]
    select max(login_time) from shopper_login l 
      where l.user_id = s.id and l.success = 1
    ) as last_login,
    m.first_login
  from shopper s
  join referrer r on r.frequent_id = s.id
  join ( -- 5. Table Expression / Inline View / Derived Table [XN]
    select user_id, min(login_time) first_login from shopper_login
      where success = 1 group by user_id
  ) m on m.user_id = s.id
  where r.rid is null
    and s.id not in ( -- 6. Traditional Subquery [CN]
      select user_id from persona
        where description = 'Fashionista'
          and id in ( -- 7. Nested subquery [CN]
            select user_id from users where region = 'NORTH')
    );

图例:

[C]: Can be correlated
[X]: Cannot be corretaled
[N]: Can include nested subqueries

我的问题是:

  • 我得到了所有可能的类型吗?这些类型的子查询是否有替代名称?
  • 我认为只有标量 (#4)、传统 (#6) 和嵌套 (#7) 子查询可以相关吗?
  • 我认为表表达式和 CTE(#1、#2 和 #3)不能关联的想法是否正确? (但是,它们可以包括可以关联的嵌套子查询)

最佳答案

相关子查询:

FROM shopper s
...
AND EXISTS (SELECT *
            FROM otherTable t
            WHERE t.id = s.id)

关于sql - SQL子查询有多少种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50990469/

相关文章:

javascript - 制作不同大小的网格,并希望在用户选择一个选项后更改它们的大小

jquery - 使用 jQuery 选择焦点文本在 Safari 和 Chrome 中不起作用

sql - Rails 中相乘的列的总和

MYSQL:操作数应包含 1 列

mysql - 使用从 mySQL 中的其他表中选择的结果更新表中的字段

mysql - 运行此代码时出现 SQL 错误 : #1242 - Subquery returns more than 1 row

sql - 链接服务器在 SQL Server 作业上失败

sql - 对多个表进行分组的方法

java - 当sql语句没有返回行时,resultset.next()总是返回true

sql - 如何在 T-SQL 中计算 ABCIndicator