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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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