首页 > 解决方案 > 将数据集中的多个字段与描述连接起来

问题描述

首先,让我声明我们无法控制这些表的结构,它们是第三方解决方案,我只是试图创建一个查询以按照我指定的方式获取数据。此处显示的表/查询已大大简化以显示问题。

表格1

客户标志

CustomerID - int
Flag1 - bit
Flag2 - bit
Flag3 - bit
Flag4 - bit
Flag5 - bit
Flag6 - bit
...

这些位指示设置了哪些标志(1 = 设置,0 = 未设置)。

表 2

标志信息

FlagNumber - int
FlagDescription - varchar

FlagNumber 匹配CustomerFlag 表中的字段,即FlagNumber 1 用于CustomerFlag 表中的Flag1。

我要做的是获取为客户设置的标志列表以及标志描述。

输出应该是:

CustomerID, FlagNumber, FlagDescription

我们当前的解决方案有一大堆联合查询。

select CustomerID, '1' as FlagNumber, FlagDescription
from CustomerFlag with (nolock)
left outer join FlagInformation
on FlagNumber = '1'
where Flag1 = 1
union all
select CustomerID, '2' as FlagNumber, FlagDescription
from CustomerFlag with (nolock)
left outer join FlagInformation
on FlagNumber = '2'
where Flag2 = 1
union all
select CustomerID, '3' as FlagNumber, FlagDescription
from CustomerFlag with (nolock)
left outer join FlagInformation
on FlagNumber = '3'
where Flag3 = 1
union all
...

需要注意的是,这个例子并不完整——CustomerFlag 表中大约有 60 个标志位——当前视图有 60 个联合将它们全部连接起来。

我真的想知道是否有更好的方法来做到这一点!

标签: sqlsql-server

解决方案


肯定有更好的方法。使用applyjoin

select cf.customerid, fi.flagdescription
from customerflag cf
cross apply (values (1, cf.flag1),
             (2, cf.flag2),
             . . .  -- fill in the rest of the flags here
     ) v(flagnumber, value) join
     flaginformation fi
     on fi.flagnumber = v.flagnumber
where v.value = 1

推荐阅读