Удаление дубликатов в таблице SQL, структура и угловые случаи - PullRequest
0 голосов
/ 16 марта 2012

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

У меня есть две проблемы с этим. Во-первых, мне не очень нравится процедурный SQL, поэтому я не знаю, какие структуры и т. Д. Лучше всего для этого сделать.

Во-вторых, это становится сложнее. Таблица содержит адреса, каждый адрес имеет идентификатор клиента, которому он принадлежит. У клиента может быть много адресов. У клиента должен быть хотя бы один адрес проживания. Так что, если у клиента есть 2 адреса, это довольно просто, проверьте, совпадают ли они, если так, оставьте один из них по месту жительства, удалите другие, обновите ссылки, в этом случае мне просто нужно знать выше.

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

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

Я понимаю, что это много угловых случаев, так что, если кто-то может просто помочь с структурами, используемыми для выполнения этих проверок, это было бы чрезвычайно полезно!

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

ID   CustID   Address   Type
1     25       123 St    R
2     36       567 Rd    R
3     36       567 Rd    R    < should be removed
4     36       567 Rd    P    < should be removed
5     25       99 Lane   P
6     25       99 Lane   P    < should be removed
7     25       66 Way    P

1 Ответ

2 голосов
/ 16 марта 2012

Вы должны быть в состоянии сделать что-то похожее на то, что вы хотите, используя два запроса:

-- Removes postal address if same as residential address.

DELETE FROM Table1 WHERE Table1.ID IN (
  SELECT t1.ID FROM Table1 t1
  JOIN Table1 t2 
    ON t1.CustID=t2.CustID AND t1.Address=t2.Address
       AND t1.Type='P' AND t2.Type='R');

-- Removes duplicate addresses within the same type, 
-- keeping the one with the lowest ID.

DELETE FROM Table1 WHERE Table1.ID IN (
  SELECT t1.ID FROM Table1 t1
  JOIN Table1 t2
    ON t1.CustID=t2.CustID AND t1.Address=t2.Address
       AND t1.Type = t2.Type
       AND t1.ID > t2.ID);

Демо здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...