无CTE/临时表的SQL自连接方案:实现批量行复制需求
问题解决:避免重复查询实现批次复制需求
背景与需求
现有一条性能一般的SQL查询:select AllTheThings, AndThenSome from T1,输出仅2行数据。需要将所有行复制一份,并为原行和复制行分别添加固定的两个批次值(新增Batch列,值为两个固定批次标识),生成目标输出。但该SQL需用于Microsoft Dynamics GP Integration Manager,无法使用CTE或临时表。当前采用UNION ALL两次查询的方案,但会导致原查询执行两次,性能开销翻倍。
解决方案:交叉连接虚拟批次数据集
可以通过交叉连接(CROSS JOIN)一个包含两个批次值的虚拟小数据集,让原查询仅执行一次,同时实现行复制与批次列添加的需求,避免性能翻倍问题。
示例SQL代码:
select t1.AllTheThings, t1.AndThenSome, batches.Batch from ( -- 原查询仅执行一次 select AllTheThings, AndThenSome from T1 ) t1 -- 交叉连接包含两个批次值的数据集 cross join ( select 'Batch1' as Batch union all select 'Batch2' as Batch ) batches
说明
- 原查询被嵌套在子查询中仅执行一次,结果会与虚拟批次数据集中的每一行进行交叉连接,最终输出为原行数×批次数量(即2行×2批次=4行),与
UNION ALL方案的输出完全一致。 - 该写法无需CTE或临时表,完全符合Microsoft Dynamics GP Integration Manager的限制,同时避免了原查询重复执行带来的性能损耗。
内容的提问来源于stack exchange,提问作者SaintFrag
相关产品推荐
相关产品推荐

