Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.20;
Скачать: CL | DM;

Вниз

Удаление повторяющихся записей   Найти похожие ветки 

 
ShuraGrp ©   (2003-01-30 14:10) [0]

Доброго времени суток Мастера. Вопрос: как удалить повторяющиеся (дублирующиеся) записи в одной таблице.


 
Reindeer Moss Eater   (2003-01-30 14:12) [1]

метод Delete в классе TDataSet


 
Anatoly Podgoretsky ©   (2003-01-30 14:13) [2]

Как они там появились, надо предотвратить появление данного явления.


 
ShuraGrp ©   (2003-01-30 14:31) [3]

Пардон. Это в Орасле. Почему-то галочка не отобразилась.


 
Reindeer Moss Eater   (2003-01-30 14:32) [4]

А все равно где


 
MsGuns ©   (2003-01-30 14:32) [5]

>Вопрос: как удалить повторяющиеся (дублирующиеся) записи в одной таблице.

А может сформулировать вопрос иначе:

Как сделать базу, чтоб в ней не было повторяющихся записей ?


 
Reindeer Moss Eater   (2003-01-30 14:35) [6]

А можно и еще иначе:
Я на самом деле знаю как удалять, но мне надо найти все записи, которые я скитаю повторяющимися?


 
ShuraGrp ©   (2003-01-30 16:25) [7]

Собственно меня интересует вопрос в той формулировке как он задан. Возможно это сделать одним SQL выражением типа
delete from Table1
where ...


 
Reindeer Moss Eater   (2003-01-30 16:29) [8]

Возможно конечно. И именно так, как ты и сформулировал.


 
Anatoly Podgoretsky ©   (2003-01-30 16:32) [9]

Думаю ты будешь недоволен после выполнения этой функции, но кто знает может тебе так и нужно.
тебе надо допольнительно использовать предикаты GroupBy и Having


 
Vint ©   (2003-01-30 16:41) [10]

Просто делаешь SELECT DISTINCT ... и все :)


 
Reindeer Moss Eater   (2003-01-30 16:45) [11]

Просто в ORACLE нет "повторяющихся" записей. Даже если таблица без PK, то всегда есть псевдо-поле ROWID. Оно уникально.


 
koks ©   (2003-01-30 16:45) [12]

2 All: Харе морочить голову человеку.... Он ведь Вас в серьез воспринимает.

2 ShuraGrp: Напиши, какая БД. Смысл всех высказываний сводится к тому, что если в таблице есть повторяющиеся записи, то база неправильно спроектирована. Вообще рекомендации можно давать зная конкретную задачу, иначе как правильно было замечено "ты будешь недоволен после выполнения"...


 
Reindeer Moss Eater   (2003-01-30 16:51) [13]

Koks, его (автора) тоже все всерьёз воспринимают:
Собственно меня интересует вопрос в той формулировке как он задан


 
Anatoly Podgoretsky ©   (2003-01-30 17:00) [14]

И есть предположение,Ю что он будет недоволен результатом, но пока он точно не подтвердил и не опроверг свой вопрос. Да и сам термин дублирующие например к Ораклу не применим.


 
Vint ©   (2003-01-30 17:02) [15]

А почему собственно не может быть одинаковых записей???
строки его таблицы могут отличаться всего содержанием одного поля, теперь по прошествии какого то периода это поле надо суммировать, усреднить, выбрать большее и т.д. а от мусора избавиться, вот тут и нужен Group By или Distinct.
Хоть я и не знаток SQL, но помоему человек получил ответ на свой вопрос.


 
Reindeer Moss Eater   (2003-01-30 17:06) [16]

А почему собственно не может быть одинаковых записей???
Оракл устроен так потому что


 
Reindeer Moss Eater   (2003-01-30 17:10) [17]

Вот скрипт:

create table testtable(
id number(9,0)
;

insert into testtable values(1);
insert into testtable values(1);
insert into testtable values(1);

commit;

Выполнив его на сервере ORACLE, получим таблицу, в которой НЕ БУДЕТ одинаковых строк


 
koks ©   (2003-01-30 17:12) [18]

2Vint
он по-моему на него забил... а одинаковые записи могут быть, но их быть не должно !!!


 
Reindeer Moss Eater   (2003-01-30 17:13) [19]

НЕ МОЖЕТ БЫТЬ ОДИНАКОВЫХ ЗАПИСЕЙ НА ОРАКЛЕ


 
Vint ©   (2003-01-30 17:18) [20]

>koks © (30.01.03 17:12)
похоже на то :)

>Reindeer Moss Eater (30.01.03 17:06)
в любой БД ее индекс не позволит создать 2 идентичных записи!


 
Reindeer Moss Eater   (2003-01-30 17:21) [21]

Могут быть записи, которые выглядят одинаково с точки зрения автора вопроса. Спрашивать у нас какие это записи и как их удалить?
Где логика и здравый смысл?


 
Vint ©   (2003-01-30 17:24) [22]

>Reindeer Moss Eater (30.01.03 17:21)
GOOD!!! на этом и порешим :)))


 
Reindeer Moss Eater   (2003-01-30 17:24) [23]

>Reindeer Moss Eater (30.01.03 17:06)
в любой БД ее индекс не позволит создать 2 идентичных записи!


Скрипт мой видел? В нем нет индексов. И записей одинаковых не будет.


 
ShuraGrp ©   (2003-01-30 18:10) [24]

Выше былосказано, что база Оракл. Ежу понятно что rowid уникально. Но rowid не является колонкой таблицы (по крайней мере при создании).
Упростим задачу.
Есть Табл1:
Код Имя
1 Пакет
1 Пакет
1 Пакет
2 Бумага
2 Бумага

Надо получить:
Код Имя
1 Пакет
2 Бумага

Как эти записи умножились и как это предотвратить - этот вопрос
не ставился.


 
ShuraGrp ©   (2003-01-31 10:04) [25]

Конкретику никто не скажет?


 
Danilka ©   (2003-01-31 10:10) [26]

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

а на будущее, просто напиши триггер, который-бы не допускал повторения записей.


 
Danilka ©   (2003-01-31 10:21) [27]

Danilka © (31.01.03 10:10)
>а на будущее, просто напиши триггер, который-бы не допускал повторения записей.

это на тот случай, если надо чтоб орокол все заглатывал и не ругался.

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


 
ShuraGrp ©   (2003-01-31 13:03) [28]

Народ Вы когда научитесь отвечать на конкретный вопрос.
Пока читал сам придумал вот что:
delete from table
where rowid in
(select rowid from table
minus
select min(rowid) from table
group by field1, field2
)

Еще варианты будут?


 
Reindeer Moss Eater   (2003-01-31 13:10) [29]

delete from mytable
where rowid not in (select max(rowid) from mytable group by field1,field2)


 
{bas} ©   (2003-01-31 13:17) [30]

вот еще вариант :))
delete from mytable
where rowid not in
(select min(rowid) from mytable group by field1,field2)



 
ShuraGrp ©   (2003-02-03 10:58) [31]

not in очень медленная. Испытывал на таблице 1.5 млн записей
мой вариант - 35 сек, вариант с not in не дождался.


 
EthernalWonderer   (2003-02-03 15:24) [32]

Как найти строки, не позволяющие наложить FK (PK):

1. Создание вспомогательной таблицы exceptions через скрипт $ORACLE_HOME/rdbms/admin/utlexcpt.sql.
Скрипт создает таблицу exceptions следующей структуры:

SQL> desc exceptions
Name Null? Type
-------------- -------- --------------
ROW_ID ROWID
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
CONSTRAINT VARCHAR2(30)
Вы можете переименовать эту таблицу по своему желанию

2. Получение ROWID строк, вызывающих нарушение уникальности ключа.

SQL> alter table DOCS add constraint PK_DOCS primary key (DOC_ID)
2 exceptions into EXCEPTIONS;
alter table DOCS add constraint PK_DOCS primary key (DOC_ID)
*
ERROR at line 1:
ORA-02437: cannot validate (EDWARD.PK_DOCS) - primary key violated

real: 204695
SQL>
SQL> select d.doc_id
2 from docs d, exceptions e
3 where d.rowid = e.row_id and
4 e.constraint = "PK_DOCS"
5 order by d.doc_id;

DOC_ID
---------
53470
53470
1170094
1170094
2153448
2153448
2845200
2845200

8 rows selected.

Это не моё решение - содрано где - то (на sql.ru, кажется).


 
kok   (2003-02-03 17:09) [33]

я бы сделал так:
insert into NewTable select distinct KOD, IMIA from MyTable.

Ну а потом - удаляем Все из MyTabe - копируем туда NewTable.
Пригодно для разового использования...

Если нужно не для разового использования - все зависит от того, для чего тебе это надо...



Страницы: 1 вся ветка

Текущий архив: 2003.02.20;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.016 c
1-63665
AlekseyZ
2003-02-11 08:41
2003.02.20
Странное поведение


3-63578
kerkonst
2003-02-04 10:46
2003.02.20
Фильтр по значению поля из другой таблицы


3-63543
Delphinium
2003-02-01 15:10
2003.02.20
ADO Connection


14-63778
Ihor Osov'yak
2003-02-03 19:31
2003.02.20
InstallShield и InprocServer32 для inproc COM - что то торможу..


3-63540
Игорь(р)
2003-01-31 13:39
2003.02.20
Сложности с сортировкой через ADO