如何:使用CTE从非规范化数据中选择标准化视图?

时间:2009-08-17 19:52:27

标签: sql select common-table-expression normalize

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

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

将来源视为:

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

我从dbo.split(CommaSepField)执行了正常的select *,但这一次只能在一条记录上运行(并且你不能用表值函数提供字段的值。更不用说,你如何结合所有这些单一结果集?

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

输出当然是:

的ProductID
123 1
123 3
123 5
123 15
456 2
456 4
456 5
456 16

我在StackOverflow和Google中对此进行了相当多的研究,但并没有真正找到可以应用的答案。如果我错过了,我道歉。请发送链接:D。

1 个答案:

答案 0 :(得分:4)

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

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