子查询

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子查询

LATERAL子查询是在在其语句中引用另一个查询或子查询的相关select子查询,通常在left joininner 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

性能最佳实践

当其他查询开始执行时,标量子查询的结果完全加载到内存中。为防止由于内存耗尽而导致执行错误,请确保子查询返回尽可能少的结果。