Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление повторяющихся записей [D6]


Страницы:   1 2

ShuraGrp ©   (2003-01-30 14:10:00) 

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


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

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

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

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


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

Как найти строки, не позволяющие наложить 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, кажется).


ShuraGrp   (2003-02-03 10:58:00) [3]

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


{bas}   (2003-01-31 13:17:00) [4]

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


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

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


ShuraGrp   (2003-01-31 13:03:00) [6]

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

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


Danilka   (2003-01-31 10:21:00) [7]

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

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

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


Danilka   (2003-01-31 10:10:00) [8]

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

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


ShuraGrp   (2003-01-31 10:04:00) [9]

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


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

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

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

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


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

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


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


Vint   (2003-01-30 17:24:00) [12]

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


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

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


Vint   (2003-01-30 17:18:00) [14]

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

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


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

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


koks   (2003-01-30 17:12:00) [16]

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


Reindeer Moss Eater   (2003-01-30 17:10:00) [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, получим таблицу, в которой НЕ БУДЕТ одинаковых строк


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

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


Vint   (2003-01-30 17:02:00) [19]

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо