#sql #database
# DuckDB Doc
- https://duckdb.org/docs/sql/query_syntax/from.html#lateral-joins
- `LATERAL` 关键字允许 FROM clause 中的子查询引用之前的子查询。这个特性也被称为 lateral join。
```sql
SELECT *
FROM range(3) t(i), LATERAL (SELECT i+1) t2(j);
```
- Lateral joins 是关联子查询的泛化,因为它们针对每个输入值可以返回多个值,而不仅仅是返回一个值。
```sql
SELECT *
FROM
generate_series(0,1) t(i),
LATERAL (SELECT i+10 UNION ALL SELECT i+100) t2(j);
```
- 可以将 `LATERAL` 视为一个循环,从第一个子查询遍历 rows,作为第二个子查询的输入。
- 上面的例子中,我们从 t 中遍历,然后在 t2 中引用它的列 `i`。
- 也可以从 `LATERAL` 子查询中引用多个列(attributes)。
```sql
CREATE TABLE t1 AS
SELECT *
FROM range(3) t(i), LATERAL (SELECT i + 1) t2(j);
SELECT *
FROM t1, LATERAL (SELECT i + j) t2(k)
ORDER BY ALL;
```
---
# PostgreSQL Doc
- 在 FROM 中出现的子查询可以用关键字 LATERAL 作为前缀。这允许它能引用之前的 FROM items 的 **columns**。
- 出现在 FROM 中的 table function 前面也可以使用 LATERAL,但这是**可选的**。function 的参数默认可以引用前面 FROM item 的列。