SQL 中的横向连接允许 FROM 子句中的子查询引用同一查询中较早列出的表中的列。这与标准连接不同,在标准连接中,每个子查询都独立运行。通过使用诸如 LATERAL
(在 PostgreSQL 中) 或 CROSS APPLY
/OUTER APPLY
(在 SQL Server 中) 之类的关键字,你可以在子查询和外部表之间创建依赖关系,从而实现逐行处理。例如,横向连接可以计算主表的每一行的结果,例如获取每个客户的最新订单,其中子查询依赖于当前客户的 ID。
一个常见的用例是使用表值函数或相关子查询。假设你有一个 users
表和一个 orders
表。要获取每个用户的最新订单,你可以编写
SELECT u.id, o.order_date
FROM users u
LEFT JOIN LATERAL (
SELECT order_date
FROM orders
WHERE user_id = u.id
ORDER BY order_date DESC
LIMIT 1
) o ON true;
在这里,LATERAL
内部的子查询引用了外部 users
表中的 u.id
。如果没有 LATERAL
,则子查询无法访问 u.id
,因为标准连接会独立处理表。此方法有效地检索每行结果,避免了复杂的窗口函数或嵌套查询。
当将数据与 JSON/数组展开或分层查询结合使用时,横向连接特别有用。例如,如果 products
表存储了标签的 JSON 数组,你可以使用
SELECT p.id, tag_data->>'name' AS tag
FROM products p
LEFT JOIN LATERAL jsonb_to_recordset(p.tags) AS tag_data(tag_id INT, name TEXT) ON true;
这会将 JSON 数组展开为行,其中每一行都依赖于当前产品的 tags
列。但是,性能可能会有所不同:横向连接可能会为每一行重复执行子查询,因此建议在子查询中建立索引或限制结果。当需要特定于行的计算或转换时,请使用它们,但要测试大型数据集的效率。