SQL子查询允许在另一个查询中重用选择查询的结果。
hubble支持两种子查询:
当子查询包含数据修改语句时,即使周围查询仅使用结果行的子集,数据修改也始终执行完成。
这适用于使用(...)
符号定义的子查询和使用WITH
定义的子查询。
例如:
WITH a AS (INSERT INTO b(c) VALUES (10), (20), (30))
SELECT * FROM a LIMIT 1;
当子查询使用在周围查询中定义的表名或列名时,它被称为是相关的。
例如,要查找至少有一个订单的客户:
select
c.name
from
customer as c
where
exists (select * from orders as o where o.c_id = c.id);
LATERAL
子查询是在在其语句中引用另一个查询或子查询的相关select
子查询,通常在left join
或inner join
的上下文中。与其他相关子查询不同,LATERAL
子查询在引用查询中为内部子查询中的每一行迭代,就像for
循环一样。
要创建LATERAL
子查询,请直接在内部子查询SELECT
语句之前使用LATERAL
关键字。
select empno,ename from emp , LATERAL (select * from dept d where d.deptno = emp.deptno and deptno = '50');
empno | ename
--------+---------
7580 | WAL%ER
当其他查询开始执行时,标量子查询的结果完全加载到内存中。为防止由于内存耗尽而导致执行错误,请确保子查询返回尽可能少的结果。