我们有重复的客户号码表:
A varchar(16) NOT NULL,
B varchar(16) NOT NULL
这些列开始是新旧(删除和保留),但移交给既不是首选的位置。这些专栏实际上只是“A”和“B” - 对于同一个客户而言,以任何顺序都是两个数字。
此外,该表可以具有任意数量的成对的同一个客户。您可能会看到像
a,b
b,c
意义a,b,c都是针对同一个客户。您可能还会看到像
a,b
b,a
c,a
这意味着a,b,c都是同一个客户。
这是不是一个干净的非循环表示法,如“旧”和“新”值。客户的客户ID列表在此表中以一行或多行的块表示,其中唯一的连接是一行中的A或B列的值可能显示在其他行的A或B列中。我的任务是将它们全部绑定到每个客户的列表中。
我想这个烂摊子转换为类似
MasterKey int NOT NULL,
CustNum varchar(16) NOT NULL UNIQUE,
PRIMARY KEY(MasterKey, CustNum)
的一个或多个号码,客户将分享此表中的MasterKey。如UNIQUE约束所述,给定的CustNum不能出现一次以上。
因此,举例来说,像这样的行从原来的
1a,1b
1b,1c
2a,2b
2b,2c
2d,2a
...
应该结束了在新表
1 1a
1 1b
1 1c
2 2a
2 2b
2 2c
2 2d
...
编辑这样行:以上数值只是为了格局明确。实际的客户号码值是任意varchar
s。
我尝试的解决方案
这感觉就像递归工作,因此一个CTE。但源数据的潜在循环特性使我很难获得锚定案例。我试图将它预先清理成更多的非循环形式,但我似乎无法得到正确的结果。
我也固执地试图做这个基于集合的SQL操作,而不是诉诸于游标和循环。但也许这是不可能的。
我花了好几个小时思考这个,尝试不同的方法,但它不断滑落。任何关于正确方法的想法或建议,甚至是一些示例代码?
我放弃了对这两个答案的支持,但我接受了我自己的答案,因为它是最正确和最完整的答案。我觉得这很奇怪,但从常见问题解答看来,这应该是我应该做的。再次感谢Beth和JBrooks! –