如何:选择使用CTE非规范化的数据归一化的看法?
-
18-09-2019 - |
题
这是一个非常标准的新手问题,但我正在寻找一个专家巧妙的方式与一些代码来做到这一点。 (我知道如何做到这漫长的手,用程序代码和光标,所以我们可以跳过答案的一部分。)基本上,我有一个去标准化的数据集的,我需要提取归一化表一组处理方法即可。原始数据来自Excel中,这是我作为附加表从MS SQL查询。一个单一的场(在Excel和因此SQL)具有逗号分隔部门列表的每个产品参与。
我知道我应该正常化的数据,但它是从Excel中来(和用户这样做是不切合实际)。我知道我可以通过每个记录(如游标或语句)用程序做这个循环,但似乎没有必要与当今可用的工具。 有一个单独的语句,我可以提取主键与“参与”字段这些记录?
源看作:
的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 结果 456 16 结果
我研究这个很中的StackOverflow和谷歌了一下,但并没有真正找到可以适用的是一个答案。我很抱歉,如果我错过了。请发送链接:d
。解决方案
您可以实际使用逗号分隔TVF,通过使用 CROSS APPLY
<加盟/ A>运算符:
select * from Table CROSS APPLY dbo.split(CommaSepField)