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 2021-09-15 15:34  荆棘人  阅读(645)  评论(0编辑  收藏  举报

导航