首页/数据/SQL 速查/LATERAL:子查询引用左侧表
本包目录(311 条)

LATERAL:子查询引用左侧表

让 FROM 中的子查询引用同一 FROM 里写在它左侧的表(类似逐行相关子查询):PostgreSQL 9.3+、MySQL 8.0.14+ 支持。

SQL 速查数据更新于 2026-10-12

PostgreSQL

PostgreSQL
SELECT u.id, u.name, o.amount
FROM users u
CROSS JOIN LATERAL (
    SELECT amount
    FROM orders o
    WHERE o.user_id = u.id
    ORDER BY o.created_at DESC
    LIMIT 1
) o;

MySQL 8

MySQL 8
SELECT u.id, u.name, o.amount
FROM users u,
LATERAL (
    SELECT amount
    FROM orders o
    WHERE o.user_id = u.id
    ORDER BY o.created_at DESC
    LIMIT 1
) o;
语义子查询可引用它左侧的表
MySQL8.0.14+ 支持 LATERAL 派生表
替代窗口函数 ROW_NUMBER 也能实现同目标

易错点

  • LATERAL 子查询通常逐行执行,外层行数大且内层没走索引时会明显变慢
  • MySQL 的 LATERAL 仅用于派生表位置,使用范围比 PostgreSQL 窄

数据来源与参考

  • MySQL 8.0 Reference Manual · Lateral Derived Tables
  • PostgreSQL Documentation · LATERAL Subqueries
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌