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)