2013-04-03 3 views
2

Следуя за кодом earlier question, я пытаюсь привести в порядок таблицу SQL, содержащую номера телефонов. Мне нужно удалить повторяющиеся номера за строку - не через всю таблицу. Например, моя таблица выглядит следующим образом:Дедупликация данных SQL для каждой строки

| CustomerID | Tel1  | Tel2  | Tel3  | Tel4  | Tel5  | Tel6  | 
| Cust001 | 01222222 || 07111111 | 07222222 | 01222222 | NULL  | 
| Cust002 | 07444444 | 07555555 | 015333333| 07555555 | NULL  | NULL  | 
| Cust003 | 01222222 | 017777777 | 07888888 | 017777777 | 016666666 | 01222222 | 

, и я хотел бы, чтобы удалить любое число, которое появляется в два раза или более в той же строке ... так что таблица будет в конечном итоге выглядит как:

| CustomerID | Tel1  | Tel2  | Tel3  | Tel4  | Tel5  | Tel6 | 
| Cust001 | 01222222 || 07111111 | 07222222 | NULL  | NULL | 
| Cust002 | 07444444 | 015333333 | 07555555 | NULL  | NULL  | NULL | 
| Cust003 | 01222222 | 017777777 | 07888888 | 016666666| 013333 | NULL | 

Порядок номеров телефонов не имеет значения, если числа указаны в первых столбцах, а любые NULLS - «справа».

SQLFiddle есть здесь - может ли кто-нибудь предложить, как эффективно удалять повторяющиеся значения в строке?

+3

** Примечание: ** Постарайтесь нормализовать таблицу так, чтобы у вас была еще одна таблица 'CustomersPhones':' CustomerId' внешний ключ для таблицы клиентов, 'PhoneNumber' –

+1

В качестве другой примечания, если вы следуете выше, вы можете использовать простые уникальные ограничения, чтобы гарантировать, что вы не сохранили дублирующие номера телефонов для клиентов. – steoleary

+0

Я боюсь, что унаследовал эту структуру таблицы, как это ужасно, и ее изменение невозможно :( – KenD

ответ

3

Вы можете попробовать проложить вперед подход, особенно если это разовая вещь или вы время от времени очищаете.

UPDATE phonenumbers SET tel6 = NULL 
WHERE tel6 IN(tel5,tel4, tel3, tel2, tel1); 
UPDATE phonenumbers SET tel5 = NULL 
WHERE tel5 IN(tel4, tel3, tel2, tel1); 
UPDATE phonenumbers SET tel4 = NULL 
WHERE tel4 IN(tel3, tel2, tel1); 
UPDATE phonenumbers SET tel3 = NULL 
WHERE tel3 IN(tel2, tel1); 
UPDATE phonenumbers SET tel2 = NULL 
WHERE tel2 = tel1; 

SQLFiddle

Тем не менее, я полностью согласен с @Mahmoud Гамаль и @steoleary, что если вы можете изменить DDL вашей таблицы, вы должны сделать это.

+0

Это большая таблица, которая нуждается в регулярной очистке, но это кажется самым разумным вариантом для меня - спасибо ! – KenD

+0

Вы, безусловно, приветствуются. Заверните его в хранимую процедуру и запустите с помощью SQL Agent в нерабочее время. – peterm

Смежные вопросы