You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:25:16