sql查询表值函数返回表 Out Apply关键字的使用

out  apply是sql中较少使用的关键字。它还有个兄弟 cross apply。

表值函数可以返回一个表作为函数的结果。如:

CREATE FUNCTION fnGetFlightSegment(@orderNo varchar(32))
RETURNS TABLE
AS
RETURN
( 
    SELECT * FROM FlightSegment
    WHERE OrderNo= @orderNo
)

我们的主表,比如FlightOrder表是没法和表值函数进行关联(inner join left join 等)。但是可以使用 out Apply 或者 cross  Apply函数进行关联。

两者的区别有一篇文章翻译解释的非常好,请参照文章:

 

文章标题:sql out apply_在SQL Server中CROSS APPLY和OUTER APPLY之间的区别

 

------------------------------------------------------------

outer apply 可以允许右边使用NULL来填充(类似于Left join)

OUTER APPLY 代码示例:

复制代码
--Create a table-valued function that returns the last two orders for a customer
CREATE FUNCTION dbo.fnGetLastTwoCustomerOrders (@CustomerId AS INT)
RETURNS TABLE
AS
RETURN
(
  SELECT TOP 2 *
  FROM Orders O
  WHERE O.CustomerId = @CustomerId
  ORDER BY OrderDate DESC
)

--Use OUTER APPLY to join Customers with the function
SELECT C.Name, O.OrderId, O.Amount, O.OrderDate
FROM Customers C
OUTER APPLY dbo.fnGetLastTwoCustomerOrders (C.CustomerId) O
ORDER BY C.Name, O.OrderDate DESC
复制代码

outer apply 代码示例2

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1
OUTER APPLY
(
    SELECT TOP 2 * FROM Score AS T
    WHERE T1.StudentNo = T.StudentNo
    ORDER BY T.ExamDate DESC
) AS T2

OUTER APPLY 的意思是“外部应用”,与 CROSS APPLY 的原理一致,只是在匹配失败时,左表与右表也将合并为一条记录输出,不过右表的输出字段为null。(与 LEFT OUTER JOIN 类似)

查询每个学生最近两次的考试成绩,没有参加考试的同学成绩补 null

参考资料:SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询 - 好吧啦网 (haobala.com)

这是一个很好的讲解文章!!!

 

cross apply 需要左右两个表达式都有输出才显示(类似于Inner Join)

复制代码
SELECT      per.Name 用户, cur.Name 客户, cur.Id 客户编号
FROM        Test.dbo.[User] per
CROSS APPLY (SELECT     TOP 1
                        cur.Name, cur.Id
             FROM       Test.dbo.UserCustomerRelation rela
             INNER JOIN Test.dbo.Customer cur ON cur.Id = rela.CustomerId
             WHERE      per.Id = rela.UserId
             ORDER BY   cur.Id DESC) cur
复制代码

参考资料:SQL Server关于apply的两种形式cross apply 和 outer apply (cylyccjy.com)

 

posted on   荆棘人  阅读(680)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2017-09-15 雅图CAD

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示