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)