SQL Server连接查询之Cross Apply和Outer Apply的区别及用法

发布时间 2023-12-06 17:45:18作者: 每天进步多一点
先简单了解下cross apply的语法以及会产生什么样的结果集吧!
示例表:

 

SELECT * FROM tableA CROSS APPLY tableB

两张表直接连接,不需要任何的关联条件,产生的结果就是这两张表的笛卡尔积 

 相当于:select * from tableA,tableB
与之对应的还有Outer Apply,下面讲解一下Cross Apply 和 Outer Apply 的区别:
首先是Cross Apply:

SELECT * FROM tableA a CROSS APPLY (select * from tableB where id=a.id) b

 这个结果集和 select * from tableA a inner join tableB b on a.id=b.id 一模一样,这就相当于inner join 的连接查询嘛!当然,你也可以这样写:

SELECT * FROM tableA a CROSS APPLY tableB b WHERE a.id=b.id

结果集一模一样无差别!
其次是Outer Apply:

SELECT * FROM tableA a OUTER APPLY (select * from tableB where id=a.id) b

发现了吧!这个结果集和left join连接查询产生的结果集一模一样~
同时,发现Cross Apply 和 Cross Join 的区别了没?
Cross Apply 可以在关联表子查询中用前一个关联表的字段的值,而Cross Join 却不行,比如这样写:SELECT * FROM tableA a CROSS JOIN (select * from tableB where id=a.id) b,语法上就不能通过!
因此Cross Join 很鸡肋,既然有Cross Apply了,那么Cross Join几乎毫无存在的价值~

另一种用法:

SELECT * FROM 
(
    SELECT 1 AS ID,'A,B,C,D' AS B 
    UNION ALL
    SELECT 2 AS ID,'D,E' AS B
    UNION ALL
    SELECT 3 AS ID,'F,G' AS B
) A cross apply fn_SplitString(A.B,',') v