这是一个非常标准的新手问题,但我正在寻找一种专家聪明的方法来用很少的代码做到这一点。(我知道如何用程序代码和游标来做这个长手,所以我们可以跳过那部分答案。)基本上,我有一个非规范化数据集,我需要在集合处理中提取一个规范化表方式。原始数据来自 Excel,我将其作为表格附加到 MS SQL 中进行查询。单个字段(在 Excel 和 SQL 中)有一个逗号分隔的每个产品参与的部门列表。
我知道我应该对数据进行规范化,但它来自 Excel(用户这样做是不切实际的)。我知道我可以通过一个循环遍历每条记录的过程(如游标或 with 语句)来做到这一点,但对于今天可用的工具来说,这似乎是不必要的。 是否有一条语句可以在其中为这些记录提取带有“参与”字段的主键?
将源想象为:
ProductIDDepartments
123 1,3,5,15
456 2,4,5,16
我做了正常的 select * from dbo.split(CommaSepField) 但这一次只适用于一条记录(并且您不能使用表值函数提供字段的值。更不用说,您如何合并所有这些单个结果套?
统一所有结果集让我想到了公共表表达式,但我无法完全弄清楚如何(1)使用扩展字段获取主键,以及(2)如何格式化查询以使其工作。
输出当然是:
ProductIDDept
123 1
123 3
123 5
123 15
456 2
456 4
456 5
456 16
我在 StackOverflow 和 Google 中对此进行了相当多的研究,但并没有真正找到适用的答案。如果我错过了,我深表歉意。请发送链接:D。