【发布时间】: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