- 在 MySQL 8.0.14 之前,派生表不能引用它所在的SELECT语句外部的表。从 MySQL 8.0.14 开始,派生表支持LATERAL关键字前缀,表示允许派生表引用它所在的 FROM 子句中的其他表。横向派生表能够完成普通派生表无法完成或者效率低下的操作
- 但是同时存在以下限制:
- 横向派生表只能出现在FROM子句中,包括使用逗号分隔的表或者标准的连接语句(JOIN、[INNER] JOIN、CROSS JOIN、LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN)。
- 如果横向派生表位于连接操作的右侧,并且引用了左侧的表,连接类型必须为 [INNER] JOIN、CROSS JOIN 或者 LEFT [OUTER] JOIN。
- 如果横向派生表位于连接操作的左侧,并且引用了右侧的表,连接类型必须为 [INNER] JOIN、CROSS JOIN或者RIGHT [OUTER] JOIN。
- 如果横向派生表引用了聚合函数,那么该函数的聚合查询语句不能是横向派生表所在的 FROM 子句所属的查询语句。
- 根据 SQL 标准,表函数拥有一个隐式的LATERAL,这与 MySQL 8.0 到 MySQL 8.0.14 之前版本的实现一致。但是,根据标准,函数 JSON_TABLE() 之前不能存在LATERAL关键字,包括隐式的LATERAL
示例
SELECT d.department_name, t.first_name, t.last_name, t.salary
FROM departments d
LEFT JOIN LATERAL (SELECT e.department_id, e.first_name, e.last_name, e.salary
FROM employees e
WHERE e.department_id = d.department_id
ORDER BY e.salary DESC LIMIT 5) t
ON d.department_id = t.department_id
ORDER BY d.department_name, t.salary DESC;
运行结果如下:
department_name |
first_name |
last_name |
salary |
rn |
Accounting |
Shelley |
Higgins |
12008.00 |
1 |
Accounting |
William |
Gietz |
8300.00 |
2 |
Administration |
Jennifer |
Whalen |
4400.00 |
1 |
Benefits |
NULL |
NULL |
NULL |
NULL |
Construction |
NULL |
NULL |
NULL |
NULL |
Contracting |
NULL |
NULL |
NULL |
NULL |
ControlAndCredit |
NULL |
NULL |
NULL |
NULL |
CorporateTax |
NULL |
NULL |
NULL |
NULL |
Executive |
Steven |
King |
24000.00 |
1 |
Executive |
Neena |
Kochhar |
17000.00 |
2 |
Executive |
Lex |
DeHaan |
17000.00 |
3 |
Finance |
Nancy |
Greenberg |
12008.00 |
1 |
Finance |
Daniel |
Faviet |
9000.00 |
2 |
Finance |
John |
Chen |
8200.00 |
3 |
Finance |
JoseManuel |
Urman |
7800.00 |
4 |
Finance |
Ismael |
Sciarra |
7700.00 |
5 |
GovernmentSales |
NULL |
NULL |
NULL |
NULL |
HumanResources |
Susan |
Mavris |
6500.00 |
1 |
来自 <https://dev.mysql.com/doc/refman/8.0/en/lateral-derived-tables.html>