我們有重複的客戶號碼錶:
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! –