SQL Server - 创建数据映射/集合的有效方法

时间:2016-04-12 17:48:59

标签: sql-server dictionary join

假设我在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是一个相当大的表。

有任何想法/建议吗?

1 个答案:

答案 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