首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server -创建数据映射/聚合的有效方法

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

Stack Overflow用户
提问于 2016-04-12 17:48:59
回答 1查看 135关注 0票数 3

假设SQL Server (2012)中有下表:

代码语言:javascript
复制
MyTable:
Col1:    Col2:    Col3:   Col4:    Val1:   ...   Valn:
a        b        c       d        123           1234
....

我希望创建一个映射表,将Col1 - Col4中的特定值映射到特定的标签。因此,例如,它可以如下所示:

代码语言:javascript
复制
MyMaps:
Col1:    Col2:    Col3:    Col4:    Label:
a        <null>   <null>   d        Label1
<null>   b        <null>   d        Label2    

例如,第一行可以读为:将标签'Label1‘给MyTable中的任何一行,其中= 'd'

因此,我创建的允许此映射的查询是:

代码语言:javascript
复制
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是一个相当大的表。

有什么想法/建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-26 18:31:27

有多种方法可以这样做,如选择第一个匹配项或使用复杂联接或使用循环编写复杂的TSQL等等。

代码语言:javascript
复制
  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)。可以在执行insert或update操作时计算映射。

或者,如果提前知道MyMaps,即查找表,则可以定义所有组合,如(a、b、c、d、标签1)、(null、b、c、null、label2)、(null、d、label3)。这样,您就可以加入,而不必进行合并和ISNULL。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36580564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档