VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

APPLY子句

功能描述

指定针对left_table_source的每行,对APPLY运算符的right_table_source求值。当right_table_source包含从left_table_source取列值作为其参数之一的表值函数时,此功能很有用 。

注意事项

  • 必须使用APPLY指定CROSS或OUTER。 如果指定CROSS,针对left_table_source的指定行对right_table_source求值,且返回了空的结果集,则不生成任何行。
  • 如果指定OUTER,则为left_table_source的每行生成一行,即使在针对该行对right_table_source求值且返回为空时,也会生成空行。
  • APPLY运算符的左操作数和右操作数都是表表达式。 这些操作数之间的主要区别是,right_table_source可以使用表值函数,该函数可从left_table_source获取一个列作为函数的参数之一 。 left_table_source可以包括表值函数,但不能以来自right_table_source的列作为参数。
  • 该功能仅在数据库兼容模式为SQL Server时支持(即数据库实例初始化时指定DBCOMPATIBILITY='MSSQL')。

语法格式

  left_table_source { CROSS | OUTER } APPLY right_table_source;

参数说明

  • left_table_source

    上一个参数中定义的一个表源。

  • right_table_source

    上一个参数中定义的一个表源。

示例

1、创建测试表并插入数据。

-- 创建左表
CREATE TABLE left_table_source (
    id INT,
    name VARCHAR(50),
    PRIMARY KEY (id)
);
-- 创建右表
CREATE TABLE right_table_source (
    id INT,
    age INT,
    PRIMARY KEY (id)
);
-- 向左表插入数据
INSERT INTO left_table_source (id, name)
VALUES (1, 'John'), (2, 'Mary'), (3, 'Tom');
-- 向右表插入数据
INSERT INTO right_table_source (id, age)
VALUES (1, 25), (3, 30), (4, 35);

3、使用CROSS APPLY和OUTER APPLY子句进行查询。

-- 使用CROSS APPLY子句查询
SELECT t1.*, t2.*
FROM left_table_source AS t1
CROSS APPLY (
    SELECT age
    FROM right_table_source AS t2
    WHERE t2.id = t1.id
) AS t2;
-- 使用CROSS APPLY子句查询的结果:
| id | name | age |
|----|------|-----|
| 1  | John | 25  |
| 3  | Tom  | 30  |
(2 rows)
-- 使用OUTER APPLY子句查询
SELECT t1.*, t2.*
FROM left_table_source AS t1
OUTER APPLY (
    SELECT age
    FROM right_table_source AS t2
    WHERE t2.id = t1.id
) AS t2;
-- 使用OUTER APPLY子句查询的结果:
 id | name | age
----+------+-----
  1 | John |  25
  3 | Tom  |  30
  2 | Mary |
(3 rows)