在定义派生的表的 FORM 子句中的任何查询都必须紧跟在 LATERAL 关键字之后,如果那个查询引用任何其他表或列,在同一 FROM 子句中该表或列出现得早于定义该派生的表的那个查询的话。
横向的派生的表,以及可在它们的语法中声明的表和列别名的引用的范围,是 SQL 语言的 ISO/ANSI 标准的一部分。此为 FROM 子句中横向的派生的表的语法:
元素 | 描述 | 限制 | 语法 |
---|---|---|---|
alias | 在此为 subquery 结果的派生的表声明的临时名称 | 请参阅 AS 关键字。 | 标识符 |
column_alias | 在此为派生的表中列声明的临时的名称 | 标识符 | |
subquery | 指定要检索的行 | 可为不相关的或相关的 | SELECT 语句 |
如果其结果集为派生的表的 subquery 引用任何早于在同一 FROM 子句中出现的任何表或列,则需要 LATERAL 关键字。此处,早于意味着在 FROM 子句中的从左至右的语法令牌顺序中“在派生的表的左边”。以 LATERAL 关键字定义的派生的表称为横向的派生的表。
这支持对 FROM 子句中的其他表中列的引用,而不是仅对随后的派生的表中列的引用。可提升在连接一个或多个派生的表的 SELECT 语句中的性能。在 DELETE、UPDATE 和 CREATE VIEW 语句之内的派生的表中,横向的表和列引用也是有效的。
如果在派生的表中,已解析了所有不相关的表和列引用,则在这些派生的表的 FROM 子句中不需要 LATERAL 关键字。
SELECT * FROM t1 , LATERAL (SELECT t2.a AS t2_a FROM t2 WHERE t2.a = t1.a);
在下一示例中,d.deptno 是横向的相关引用:
SELECT d.deptno, d.deptname, empinfo.avgsal, empinfo.empcount FROM department d, LATERAL (SELECT AVG(e.salary) AS avgsal, COUNT(*) AS empcount FROM employee e WHERE e.workdept=d.deptno) AS empinfo;
在此,列表达式的 avgsal 和 empcount 别名以及 empinfo 横向的表引用出现在外查询的 projection 列表中,使用关联 deptno,从 department 表和派生的表连接符合条件的行。