【问题标题】:How to: select normalized view from denormalized data using CTE?如何:使用 CTE 从非规范化数据中选择规范化视图?
【发布时间】:2010-11-20 09:01:03
【问题描述】:

这是一个非常标准的新手问题,但我正在寻找一种专家级的聪明方法来用很少的代码做到这一点。 (我知道如何用程序代码和游标来做这个长手,所以我们可以跳过这部分答案。)基本上,我有一个去规范化的数据集,我需要在其中提取一个规范化的表一套处理方式。原始数据来自 Excel,我将其作为表格附加到 MS SQL 中进行查询。单个字段(在 Excel 和 SQL 中)有一个逗号分隔的每个产品参与的部门列表。

我知道我应该对数据进行规范化,但它来自 Excel(用户这样做是不切实际的)。我知道我可以通过一个循环遍历每条记录的过程(如游标或 with 语句)来做到这一点,但对于今天可用的工具来说,这似乎是不必要的。 是否有一条语句可以让我为这些记录提取带有“参与”字段的主键?

把来源想成:

ProductID部门
 123      1,3,5,15  
456      2,4,5,16  

我做了正常的 select * from dbo.split(CommaSepField) 但这一次只适用于一条记录(你不能用表值函数提供字段的值。更不用说,你如何联合所有这些单一的结果集?

统一所有结果集让我想到了公用表表达式,但我无法完全弄清楚如何 (1) 使用扩展字段获取主键,以及 (2) 如何格式化查询以使其正常工作。

输出当然是:

ProductID部门
 123      1  
 123      3  
 123      5  
 123      15 
 456      2  
 456      4  
 456      5   kbd>
 456      16 

我在 StackOverflow 和 Google 中对此进行了大量研究,但并没有真正找到适用的答案。如果我错过了,我深表歉意。请发送链接:D。

【问题讨论】:

    标签: sql select common-table-expression normalize


    【解决方案1】:

    您实际上可以使用逗号分隔 TVF,通过使用 CROSS APPLY 运算符加入:

    select * from Table CROSS APPLY  dbo.split(CommaSepField)
    

    【讨论】:

    • 好的,太棒了。太棒了!
    • 很好的解决方案!我一直在为这种确切情况寻找一个好的解决方案。
    猜你喜欢
    • 2020-05-21
    • 2013-12-11
    • 2021-01-12
    • 1970-01-01
    • 2013-01-18
    • 2014-12-23
    • 2017-01-14
    • 2013-08-21
    • 2016-05-13
    相关资源
    最近更新 更多