为什么CROSS APPLY与INNER JOIN的查询返回结果存在差异?
两者返回结果不同的核心原因是两个查询的关联过滤逻辑完全不一致
首先看INNER JOIN的运行逻辑:
你写的JOIN子查询是先全局聚合#test2,按ControlNo分组计算出每个卡号对应的最大QuoteID,得到的聚合结果只有一行(10101,1111),再和#test1通过t.QuoteID = tt.MaxQuoteID关联,自然只能匹配到#test1中QuoteID=10101的行,符合你的预期。再看CROSS APPLY的运行逻辑:
CROSS APPLY会针对#test1的每一行单独执行一次子查询,而你子查询里写的过滤条件是where tt.QuoteID = t.QuoteID,相当于每次子查询只取#test2中QuoteID和当前#test1行QuoteID相等的记录再做聚合,逐行计算结果如下:- 处理#test1第一行
(1111, 1111,'something1'):子查询过滤到#test2中QuoteID=1111的记录,按ControlNo分组后返回max(QuoteID)=1111,所以这行会被保留 - 处理#test1第二行
(10101, 1111,'something15'):子查询过滤到#test2中QuoteID=10101的记录,按ControlNo分组后返回max(QuoteID)=10101,这行也会被保留 - 剩余#test1行的QuoteID在#test2中不存在对应记录,子查询返回空,所以被CROSS APPLY过滤
最终CROSS APPLY会返回2行,比你预期的多了一行,和INNER JOIN结果不同。
- 处理#test1第一行
如果你要让CROSS APPLY实现和INNER JOIN一致的效果,修改子查询逻辑即可:
select * from #test1 t cross apply ( select max(QuoteID) as MaxQuoteID, ControlNo from #test2 tt group by ControlNo having max(QuoteID) = t.QuoteID ) a
把关联匹配逻辑和JOIN对齐后,就能得到你期望的单条结果。
内容的提问来源于stack exchange,提问作者Serdia
相关产品推荐
相关产品推荐

