#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 的列。