假设我在SQL Server(2012)中有以下表:
MyTable:
Col1: Col2: Col3: Col4: Val1: ... Valn:
a b c d 123 1234
....
我希望创建一个映射表,将Col1
- Col4
中的特定值映射到特定标签。因此,例如,它可能如下所示:
MyMaps:
Col1: Col2: Col3: Col4: Label:
a <null> <null> d Label1
<null> b <null> d Label2
例如,第一行可以读作:
提供标签&#39; Label1&#39;到MyTable中Col1
=&#39; a&#39;和Col4
=&#39; d&#39; 。
因此,我创建的可以允许此映射的查询是:
SELECT
MyMaps.Label
,MyTable.Val1
...
,MyTable.Valn
FROM
MyTable
INNER JOIN MyMaps
ON ISNULL(MyTable.Col1, '') = COALESCE(MyMaps.Col1, MyTable.Col1, '')
AND ISNULL(MyTable.Col2, '') = COALESCE(MyMaps.Col2, MyTable.Col2, '')
AND ISNULL(MyTable.Col3, '') = COALESCE(MyMaps.Col3, MyTable.Col3, '')
AND ISNULL(MyTable.Col4, '') = COALESCE(MyMaps.Col4, MyTable.Col4, '')
它确实有效,但我很好奇这是否是实现这一目标的好方法,或者是否有更好/更有效的方法来创建映射,因为MyTable是一个相当大的表。
有任何想法/建议吗?
答案 0 :(得分:3)
有多种方法可以做到这一点,例如选择第一个匹配或使用复杂连接或使用循环等编写复杂的TSQL。对于ex)
SELECT
t.*,
Label = (
--since there can be multiple matches, this is where you apply your rules
select top 1 label
from MyMaps
where ISNULL(MyTable.Col1, '') = COALESCE(MyMaps.Col1, MyTable.Col1, '')
AND ISNULL(MyTable.Col2, '') = COALESCE(MyMaps.Col2, MyTable.Col2, '')
AND ISNULL(MyTable.Col3, '') = COALESCE(MyMaps.Col3, MyTable.Col3, '')
AND ISNULL(MyTable.Col4, '') = COALESCE(MyMaps.Col4, MyTable.Col4, '')
)
FROM MyTable t
如果是小桌子,那就好了。对于大型表,您可能希望有一个映射表,用于定义MyTable如何映射到MyMaps(将其重命名为MyTableLabel)。您可以在执行插入或更新操作时计算映射。
或者,如果提前知道MyMaps即查找表,则可以定义所有组合,例如(a,b,c,d,label 1),(null,b,c,null,label2),(null ,null,null,d,label3)。这样,您可以加入而无需执行COALESCE和ISNULL