SQL server 中 CROSS APPLY的使用

CROSS APPLY 是 SQL Server 中的一个操作符,用于将一个表表达式(如子查询、函数等)与外部表进行连接。CROSS APPLY 类似于 INNER JOIN,但它允许你在一个查询中多次引用外部表的行,并且可以动态地生成结果集。

基本语法

sql 复制代码
SELECT ...
FROM table1
CROSS APPLY (table_expression) AS alias

用途

  1. 多行结果:当子查询或表表达式返回多行结果时,CROSS APPLY 可以将这些结果与外部表的每一行进行组合。

  2. 动态生成结果:CROSS APPLY 可以根据外部表的每一行动态生成结果集。

  3. 复杂计算:在需要对每个外部行进行复杂计算或处理时,CROSS APPLY 非常有用。

示例

假设我们有一个 Employees 表和一个 Orders 表,我们希望获取每个员工的最新订单信息。

表结构

sql 复制代码
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(50)
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    EmployeeID INT,
    OrderDate DATE,
    Amount DECIMAL(10, 2)
);

INSERT INTO Employees (EmployeeID, Name)
VALUES (1, '张三'), (2, '李四');

INSERT INTO Orders (OrderID, EmployeeID, OrderDate, Amount)
VALUES 
(1, 1, '2024-01-01', 100.00),
(2, 1, '2024-01-15', 150.00),
(3, 2, '2024-02-01', 200.00),
(4, 2, '2024-02-10', 250.00);

使用 CROSS APPLY 获取每个员工的最新订单

sql 复制代码
SELECT e.EmployeeID, e.Name, o.OrderID, o.OrderDate, o.Amount
FROM Employees e
CROSS APPLY (
    SELECT TOP 1 *
    FROM Orders o
    WHERE o.EmployeeID = e.EmployeeID
    ORDER BY o.OrderDate DESC
) AS o;

结果

执行上述查询后,结果将会是:

  1. 外部表:Employees 表是外部表。

  2. 表表达式:CROSS APPLY 后面的子查询是一个表表达式,它为每个员工返回最新的订单。

  3. 连接条件:子查询中的 WHERE o.EmployeeID = e.EmployeeID 确保了子查询只处理当前员工的订单。

  4. TOP 1:TOP 1 和 ORDER BY o.OrderDate DESC 确保了子查询返回每个员工的最新订单。

与其他操作符的区别

•CROSS APPLY:类似于 INNER JOIN,但允许子查询引用外部表的每一行。

•OUTER APPLY:类似于 LEFT JOIN,即使子查询没有返回任何结果,外部表的行也会保留。

示例:

使用 OUTER APPLY假设我们希望即使某些员工没有订单,也能显示他们的信息。

sql 复制代码
SELECT e.EmployeeID, e.Name, o.OrderID, o.OrderDate, o.Amount
FROM Employees e
OUTER APPLY (
    SELECT TOP 1 *
    FROM Orders o
    WHERE o.EmployeeID = e.EmployeeID
    ORDER BY o.OrderDate DESC
) AS o;

结果

如果某个员工没有订单,结果集中对应的部分将显示为 NULL。

总结

CROSS APPLY 和 OUTER APPLY 是 SQL Server 中非常强大的操作符,特别适用于需要对每个外部行进行复杂处理或动态生成结果集的场景。希望这些示例能帮助你更好地理解和使用这些操作符。

相关推荐
惊讶的猫3 分钟前
Redis持久化介绍
数据库·redis·缓存
Apple_羊先森15 分钟前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle
全栈前端老曹1 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
神梦流1 小时前
ops-math 算子库的扩展能力:高精度与复数运算的硬件映射策略
服务器·数据库
让学习成为一种生活方式1 小时前
trf v4.09.1 安装与使用--生信工具42-version2
数据库
啦啦啦_99991 小时前
Redis-5-doFormatAsync()方法
数据库·redis·c#
生产队队长2 小时前
Redis:Windows环境安装Redis,并将 Redis 进程注册为服务
数据库·redis·缓存
老邓计算机毕设2 小时前
SSM找学互助系统52568(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 毕业设计
痴儿哈哈2 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
Σίσυφος19002 小时前
PCL法向量估计 之 方向约束法向量(Orientation Guided Normal)
数据库