Проблема
У нас есть таблица с дублирующимися номерами клиентов:
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 являются одним и тем же клиентом.
Это , а не чистое ациклическое представление, такое как "old" и«новые» значения.Список идентификаторов клиентов для клиента представлен в этой таблице фрагментами из одной или нескольких строк, где единственное соединение состоит в том, что значение для столбца 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
с.
Мои попытки решения
Это похоже на работу для рекурсии и, следовательно, CTE.Но потенциально циклическая природа исходных данных затрудняет мне получение якорного случая.Я пытался предварительной очисткой его в более ациклической форме, но я до сих пор не могу показаться, чтобы получить это право.
1041 * Я также упорно пытаюсь сделать это как на основе множество операций SQLвместо того, чтобы прибегать к курсору и циклу.Но, возможно, это не возможно.
Я потратил 8 часов на размышления об этом и пробовал разные подходы, но это ускользает.Любые идеи или предложения о правильном подходе, или даже пример кода?