横向派生子查询

Exisi 2023-03-07 22:04:22
Categories: Tags:
  • MySQL 8.0.14 之前,派生表不能引用它所在的SELECT语句外部的表。从 MySQL 8.0.14 开始,派生表支持LATERAL关键字前缀,表示允许派生表引用它所在的 FROM 子句中的其他表。横向派生表能够完成普通派生表无法完成或者效率低下的操作

 

  • 但是同时存在以下限制:
    1. 横向派生表只能出现在FROM子句中,包括使用逗号分隔的表或者标准的连接语句(JOIN[INNER] JOINCROSS JOINLEFT [OUTER] JOINRIGHT [OUTER] JOIN)。
    2. 如果横向派生表位于连接操作的右侧,并且引用了左侧的表,连接类型必须为 [INNER] JOINCROSS JOIN 或者 LEFT [OUTER] JOIN
    3. 如果横向派生表位于连接操作的左侧,并且引用了右侧的表,连接类型必须为 [INNER] JOINCROSS JOIN或者RIGHT [OUTER] JOIN
    4. 如果横向派生表引用了聚合函数,那么该函数的聚合查询语句不能是横向派生表所在的 FROM 子句所属的查询语句。
    5. 根据 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>