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

Sql 如何:使用CTE从非规范化数据中选择规范化视图?,sql,select,common-table-expression,normalize,Sql,Select,Common Table Expression,Normalize,这是一个非常标准的新手问题,但我正在寻找一个专家聪明的方法,用很少的代码来实现这一点。(我知道如何使用过程代码和光标来完成这项工作,因此我们可以跳过答案的这一部分。)基本上,我有一个非规范化的数据集,需要以一种集处理方式提取一个规范化的表。原始数据来自Excel,我将其作为表附加在MS SQL中进行查询。单个字段(在Excel和SQL中)有一个逗号分隔的列表,其中列出了每个产品参与的部门 我知道我应该规范化数据,但它来自Excel(用户这样做是不实际的)。我知道我可以通过一个循环每个记录的过程(

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

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

将来源视为:

ProductId部门
1231,3,5,15
4562,4,5,16

我从dbo.split(CommaSepField)中选择了正常的select*,但一次只能对一条记录起作用(并且不能用表值函数提供字段的值)。更不用说,如何合并所有这些单一结果集

联合所有的结果集让我想到了常见的表表达式,但我不太清楚如何(1)使用扩展的字段获取主键,以及(2)如何格式化查询以使其工作

结果当然是:

ProductIDDept
1231
1233
1235
12315
4562
4564
4565
45616


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

您可以使用逗号分隔TVF,通过使用运算符加入:

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

好的,太棒了。太棒了!很好的解决方案!我一直在寻找一个很好的解决方案来解决这个问题。