Текущий архив: 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