Re: Записи-дубликаты

From
Denis Zaitsev (2:5033/33.4)
To
Pavel Zaitsev (2:5054/37.63)
Date
2005-04-13T13:26:24Z
Area
RU.RDBMS.ORACLE
Привет, тезка! :)

В ответ на твое письмо от 12 Apr 05:

 PZ> Встала задачка: найти в произвольной таблице записи-дубликаты и в
 PZ> специальное поле проставить признак "является дубликатом". Причем
 PZ> если одинаковых записи две (больше) - они обе (все) должны быть
 PZ> помечены.

Можно попробовать использовать таблицу исключений при попытке динамического создания уникального ключа (если этот синтаксис alter table поддерживает твоя версия оракла):

create table t (n number, s varchar2(10));

insert into t values (1, 'раз');
insert into t values (1, 'раз');
insert into t values (1, 'раз');
insert into t values (2, 'два');
insert into t values (3, 'три');
insert into t values (3, 'три');

create table except_table (row_id urowid,
                           owner varchar2(30),
                           table_name varchar2(30),
                           constraint varchar2(30));

(можно использовать скрипт utlexpt1.sql)

alter table t add constraint t_unq unique (n,s) exceptions into except_table;

Если есть дубликаты, констрейнт не создается, в таблице except_table -
rowid повторяющихся строк:

SQL> select * from t where rowid in (select row_id from except_table);

 N S
-- ----------
 1 раз
 1 раз
 1 раз
 3 три
 3 три

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


Искренне ваш.

--- GolDEAD+/W32 * Jagular Team *
 * Origin: Fast, good, cheap: pick two.. (2:5033/33.4)
SEEN-BY: 452/25 461/33 74 106 640 464/34 465/204 469/125 550/5068 4623/56
SEEN-BY: 4625/9 4626/100 4641/444 4653/10 4657/50 5002/76 5002 5003/34 5004/58
SEEN-BY: 5010/53 5011/13 5015/4 28 5020/20 52 104 115 128 150 175 401 600 642
SEEN-BY: 5020/794 921 968 982 1100 1169 1212 1234 1356 1626 1642 1873 1930
SEEN-BY: 5020/2200 4400 4441 5021/3 44 5023/11 5025/19 151 5026/78 5030/69 195
SEEN-BY: 5030/382 920 1016 5032/11 16 5033/1 4 14 16 21 26 33 35 36 5034/8
SEEN-BY: 5035/10 5036/13 5037/21 5040/33 47 5041/4 5045/7 42 5049/157 5050/9
SEEN-BY: 5050/41 5051/35 5053/16 5054/1 8 9 28 35 37 45 50 5056/16 5058/77
SEEN-BY: 5059/20 5060/90 5063/5 41 51 5064/7 35 36 5070/26 66 5071/22 5079/49
SEEN-BY: 5082/6 5083/13 5090/23 5093/27 5100/113
PATH: 5033/33 1 5020/52 5054/1 37