Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Удалить дубликаты  [new]
Alibek B.
Member

Откуда:
Сообщений: 3720
Что-то никак не могу сообразить.

Есть таблица:
CREATE TABLE CUSTOMER_CONTACT
(
  CUSTOMER_CONTACT_ID  NUMBER                   NOT NULL,
  CUSTOMER_ID          NUMBER                   NOT NULL,
  CONTACT_DICT_ID      NUMBER                   NOT NULL,
  VALUE                VARCHAR2(255 BYTE)       NOT NULL
)

Здесь CUSTOMER_CONTACT_ID - PK, комбинация CUSTOMER_ID+CONTACT_DICT_ID определяет клиента и тип поля, в VALUE пишется значение поля.
Вообще-то CUSTOMER_ID+CONTACT_DICT_ID должен быть уникальным, но констрейна нет, и так получилось, что случайно были добавлены дубликаты.
Теперь для каждой пары CUSTOMER_ID+CONTACT_DICT_ID есть по два одинаковых значения. Одно из них нужно удалить, но не пойму как.
Список пар ключей, в которых есть дубликаты, получаю так:
select customer_id, contact_dict_id
from customer_contact
group by customer_id, contact_dict_id
having count(*) > 1
Но дальше не соображу, как для каждого дубля оставить только первую строку и удалить последующие.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
7 сен 10, 17:08    [9399143]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубликаты  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Alibek B.,

https://www.sql.ru/forum/actualtopics.aspx?search=%E4%F3%E1%EB%E8%EA%E0%F2%FB&bid=3
7 сен 10, 17:10    [9399166]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубликаты  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6910
delete from CUSTOMER_CONTACT
where rowid = (select max(rowid) from CUSTOMER_CONTACT group by CUSTOMER_ID,CONTACT_DICT_ID)

что-то типа этого...
7 сен 10, 17:11    [9399168]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубликаты  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6910
сорри конечно IN
7 сен 10, 17:12    [9399179]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубликаты  [new]
Alibek B.
Member

Откуда:
Сообщений: 3720
Сделал так:

delete customer_contact where CUSTOMER_CONTACT_ID not in (
        select min(CUSTOMER_CONTACT_ID)
        from customer_contact
        group by customer_id, contact_dict_id
      );

Спасибо, а то что-то сообразить не мог сразу.
7 сен 10, 17:17    [9399243]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубликаты  [new]
makitka
Member

Откуда: FROM dual
Сообщений: 886
alex-ls
delete from CUSTOMER_CONTACT
where rowid = (select max(rowid) from CUSTOMER_CONTACT group by CUSTOMER_ID,CONTACT_DICT_ID)

что-то типа этого...

и удалит он про ходу не тока дубли :)
7 сен 10, 17:41    [9399450]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубликаты  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6910
makitka
alex-ls
delete from CUSTOMER_CONTACT
where rowid = (select max(rowid) from CUSTOMER_CONTACT group by CUSTOMER_ID,CONTACT_DICT_ID)
что-то типа этого...

и удалит он про ходу не тока дубли :)

это была идея с двумя обшибками ;) не "=", а "IN" и не "IN" а "NOT IN" благо ТК все понял и не стал пенять на мои ошибки, спешил я...
7 сен 10, 17:48    [9399534]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить