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