横向的派生的表

在定义派生的表的 FORM 子句中的任何查询都必须紧跟在 LATERAL 关键字之后,如果那个查询引用任何其他表或列,在同一 FROM 子句中该表或列出现得早于定义该派生的表的那个查询的话。

横向的派生的表,以及可在它们的语法中声明的表和列别名的引用的范围,是 SQL 语言的 ISO/ANSI 标准的一部分。此为 FROM 子句中横向的派生的表的语法:

LATERAL 派生的表
元素 描述 限制 语法
alias 在此为 subquery 结果的派生的表声明的临时名称 请参阅 AS 关键字 标识符
column_alias 在此为派生的表中列声明的临时的名称 标识符
subquery 指定要检索的行 可为不相关的或相关的 SELECT 语句

用法

如果其结果集为派生的表的 subquery 引用任何早于在同一 FROM 子句中出现的任何表或列,则需要 LATERAL 关键字。此处,早于意味着在 FROM 子句中的从左至右的语法令牌顺序中“在派生的表的左边”。以 LATERAL 关键字定义的派生的表称为横向的派生的表

这支持对 FROM 子句中的其他表中列的引用,而不是仅对随后的派生的表中列的引用。可提升在连接一个或多个派生的表的 SELECT 语句中的性能。在 DELETE、UPDATE 和 CREATE VIEW 语句之内的派生的表中,横向的表和列引用也是有效的。

如果在派生的表中,已解析了所有不相关的表和列引用,则在这些派生的表的 FROM 子句中不需要 LATERAL 关键字。

横向的派生的表的示例

下列查询在 FROM 子句中包括横向的派生的表,其中 t1_a 是横向的相关引用:
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; 

在此,列表达式的 avgsalempcount 别名以及 empinfo 横向的表引用出现在外查询的 projection 列表中,使用关联 deptno,从 department 表和派生的表连接符合条件的行。

对横向相关的引用的限制

下列限制适用于横向的关联的表和列引用:
  • 不可在 ANSI FULL OUTER JOIN 查询中使用它们。
  • 不可在 ANSI RIGHT OUTER JOIN 查询中使用它们。
  • 不可在 GBase 8s 扩展 OUTER JOIN 查询中使用它们。