更新时间:2026-07-03 GMT+08:00
分享

多层嵌套子查询

功能描述

多层嵌套子查询是指在子查询中嵌套子查询,即在一个 SELECT 语句的 FROM 子句中使用另一个 SELECT 语句作为数据源,可以多层嵌套。

语法格式

SELECT attr_expr FROM (
   SELECT attr_expr FROM (
     SELECT attr_expr FROM ...
   ) [alias]
 ) [alias]; 

LATERAL 子查询语法(Spark 4.0 支持):

SELECT attr_expr FROM table_reference
   LATERAL VIEW OUTER explode(array_col) alias AS col_name;

SELECT attr_expr FROM table_reference,
   LATERAL (SELECT ... FROM ... WHERE ...) AS alias;

参数说明

参数

说明

attr_expr

查询列表达式,指定需要返回的列。

alias

子查询的别名。在嵌套查询中必须为每个子查询指定别名,否则会出错。

LATERAL VIEW

LATERAL VIEW 关键字,用于将表中某列展开为多行,常与 explode、json_tuple 等表生成函数配合使用。

LATERAL (subquery)

LATERAL 子查询,允许在 FROM 子句中引用前面表中的列。Spark 4.0 新增支持。

OUTER

可选关键字。当 LATERAL VIEW 展开结果为空时,保留原行并将展开列置为 NULL。

注意事项

  • 所要查询的表必须是已经存在的表,否则会出错。
  • 在嵌套查询中必须指定子查询的别名,否则会出错。
  • 别名必须先定义后引用,建议别名不要重名。
  • LATERAL 子查询可以引用 FROM 子句中出现在其前面的表的列。

示例

通过三次子查询,最终返回 user_info 中的 name 字段。

SELECT name 
FROM (
   SELECT name, acc_num FROM (
     SELECT name, acc_num, password FROM (
       SELECT name, acc_num, password, bank_acc FROM user_info
     ) a
   ) b
 ) c; 

LATERAL VIEW 示例,将数组列展开为多行:

SELECT name, course 
FROM student_info 
LATERAL VIEW OUTER explode(courses) courses AS course; 

LATERAL 子查询示例(Spark 4.0):

SELECT o.order_id, s.total 
FROM orders o,
   LATERAL (SELECT SUM(amount) AS total FROM order_items i WHERE i.order_id = o.order_id) s;

相关文档