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