如何重构SQL中由多个UNION组成的重复查询语句?
重构重复UNION的SQL查询
当然可以,你可以用以下几种方式重构这段SQL,大幅减少重复代码,同时逻辑和原查询完全一致:
方法一:使用UNPIVOT(列转行操作符)
UNPIVOT是SQL中专门用于将列转换为行的语法,非常适合你这种场景:
SELECT DISTINCT [Column], [Value] FROM dbo.Deals UNPIVOT ( [Value] FOR [Column] IN ( EntityName, AssetClass, VehicleType, Strategy, Bundled, Geography, Sector ) ) AS Unpvt WHERE [Value] IS NOT NULL;
这段代码会把IN子句里的每一列转换成一行记录:Column字段对应原列名,Value字段对应原列的值。最后通过WHERE过滤空值,DISTINCT去重,和原查询的输出完全一致。
方法二:用CROSS APPLY + VALUES构造列列表
这种方式和你提到的“创建列列表循环处理”思路最接近,通过VALUES定义需要处理的列名和对应字段,再用CROSS APPLY关联原表:
SELECT DISTINCT c.[Column], c.[Value] FROM dbo.Deals d CROSS APPLY ( VALUES ('EntityName', d.EntityName), ('AssetClass', d.AssetClass), ('VehicleType', d.VehicleType), ('Strategy', d.Strategy), ('Bundled', d.Bundled), ('Geography', d.Geography), ('Sector', d.Sector) ) c([Column], [Value]) WHERE c.[Value] IS NOT NULL;
后续要新增需要处理的列,只需要在VALUES块里添加一行即可,无需重复编写SELECT、FROM和WHERE逻辑,维护成本更低。
两种方法都能有效消除原查询中的重复代码,执行效率也和原查询相当(甚至更优,因为只需要扫描一次原表)。
内容的提问来源于stack exchange,提问作者Peter Olson
相关产品推荐
相关产品推荐

