LATERAL postgre
时间: 2024-12-30 08:33:37 浏览: 12
### PostgreSQL 中 LATERAL 关键字的用法
在 PostgreSQL 中,`LATERAL` 关键字用于执行依赖于外部查询结果的子查询。这使得可以在 `FROM` 子句中引用前面定义的表表达式中的列。
#### 基本语法
当使用 `LATERAL` 时,可以将它放在 `JOIN` 或者作为单独的表项来指定。其基本形式如下:
```sql
SELECT *
FROM table_name_1 t1,
LATERAL (subquery referencing columns from t1) AS sub;
```
或者更常见的写法是通过显式的 `JOIN ... ON TRUE` 来实现:
```sql
SELECT *
FROM table_name_1 t1
CROSS JOIN LATERAL (subquery referencing columns from t1) AS sub;
```
这里的关键在于子查询能够访问到左侧表格的数据行,从而允许更加灵活复杂的操作[^1]。
#### 实际案例分析
假设有一个名为 `orders` 的订单表以及一个包含多个商品 ID 列表的商品详情表 `product_ids_per_order` 。为了获取每个订单对应的全部产品信息,可以利用 `LATERAL` 进行连接并展开这些列表:
```sql
CREATE TABLE orders (
order_id int PRIMARY KEY,
customer text NOT NULL
);
INSERT INTO orders VALUES
(10, 'Alice'),
(20, 'Bob');
CREATE TABLE product_ids_per_order(
order_id int REFERENCES orders(order_id),
products integer[]
);
INSERT INTO product_ids_per_order VALUES
(10, '{100, 101}'),
(20, '{200}');
```
现在要得到每条记录对应的具体产品编号,则可以通过下面的方式完成:
```sql
SELECT o.order_id, p.product_id
FROM orders o
LEFT JOIN LATERAL unnest((SELECT products FROM product_ids_per_order WHERE order_id = o.order_id)) AS p(product_id) ON true;
```
这段代码会返回如下所示的结果集:
|order_id |product_id|
|---------|----------|
| 10| 100 |
| 10| 101 |
| 20| 200 |
在这个例子中,`unnest()` 函数被用来把数组拆分成多行数据;而 `LATERAL` 让我们能够在同一个查询语境下处理这种一对多的关系。
阅读全文