多层嵌套子查询
功能描述
多层嵌套子查询是指在子查询中嵌套子查询,即在一个 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;