powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Удаление одинаковых записей
9 сообщений из 9, страница 1 из 1
Удаление одинаковых записей
    #32557637
BobrovDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять я, со своими вопросами...
Как реализовать на практике теорию:
если последующая запись=предыдущей - удалить последующую запись
...
Рейтинг: 0 / 0
Удаление одинаковых записей
    #32557754
f_w_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BobrovDmесли последующая запись=предыдущей - удалить последующую запись
М.б. ее лучше вообще не вставлять?
...
Рейтинг: 0 / 0
Удаление одинаковых записей
    #32557835
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
Опять я, со своими вопросами...
Как реализовать на практике теорию: 
если последующая запись=предыдущей - удалить последующую запись
1. Очень плохо когда в таблице есть несколько абсолютно одинаковых записей
2. Тебе сюда http://www.ibase.ru/devinfo/deldupes.htm

Удачи.
...
Рейтинг: 0 / 0
Удаление одинаковых записей
    #32557845
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если записи полностью одинаковы - то нет критерия выборки для запроса...
Грохнутся все одинаковые...

По моему, нужно просто добавить в таблицу ID записи с автономерацией.
Даже если ты его не используешь, то нихай оно себе живет...
И тогда не будет проблем с указанием ID удаляемых записей...
...
Рейтинг: 0 / 0
Удаление одинаковых записей
    #32557949
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если записи совершенно одинаковые то необходима хранимка с

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
FOR SELECT ...
  FROM Table
  ORDER BY Field  /* обязательно чтобы выбрать одинаковые записи последовательно */ 
  INTO ...
  AS CURSOR name
BEGIN
.....
END

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

Код: plaintext
1.
DELETE FROM TABLE WHERE CURRENT OF name

Второй вариант основан на внесении в таблицу нового поля и заполнение его возрастающим значением с генератора.

Код: plaintext
1.
2.
3.
4.
5.
ALTER TABLE Table
  ADD IDfield integer;

UPDATE Table
  SET IDfield = GEN_ID(generator, 1 );

А далее в голову лезет запрос наподобии :

Код: plaintext
1.
2.
3.
4.
5.
6.
DELETE FROM Table
WHERE IDfield not in (    
    Select MIN(IDfield) as MinID
    FROM TABLE
    GROUP BY oldField
)

НО ОН НЕ СРАБОТАЕТ !!!! особенность IB состоит в том что на каждую строку по которой движется DELETE выполнится вложенный запрос (результаты сам представишь :)) Эта особенность вытекает из архитектуры - потенциально любой вложенный запрос может вернуть огромный объем данных.

по этому делается временная табличка куда переливаются данные вложенного запроса и выполняется удаление:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE tmp (
ID integer,
cnt integer
);

INSERT INTO tmp (ID,cnt)
Select MIN(IDfield) as MinID, count(IDfield) as CNT
   FROM TABLE
   GROUP BY oldField
;

DELETE FROM TABLE
  WHERE (IDfield not in (SELECT ID FROM tmp WHERE CNT =  1 ))
      AND (IDfield not in (SELECT ID FROM tmp))

На ювелирную точность и оптимальность не претендую
Рассматривать только идеи
...
Рейтинг: 0 / 0
Удаление одинаковых записей
    #32557972
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>olol
>Если записи полностью одинаковы - то нет критерия выборки для запроса...
>Грохнутся все одинаковые...

Есть. Просто ты про него не знаешь.

>Igor Elyas
>Если записи совершенно одинаковые то необходима хранимка

Не-а...

Всем смотреть указанную ссылку !

...
Рейтинг: 0 / 0
Удаление одинаковых записей
    #32558000
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DELETE FROM Table
WHERE IDfield not in (    
    Select MIN(IDfield) as MinID
    FROM TABLE
    GROUP BY oldField
)

НО ОН НЕ СРАБОТАЕТ !!!! особенность IB состоит в том что на каждую строку по которой движется DELETE 
выполнится вложенный запрос (результаты сам представишь :)) Эта особенность вытекает из архитектуры - потенциально 
любой вложенный запрос может вернуть огромный объем данных.


Ух сколько ты написал. А я вот ленивый... Зато теперь на халяву пристроюсь.:)

Если будет PK то вот так сработает

DELETE FROM Table
WHERE IDfield in (
Select MIN(IDfield) as MinID
FROM TABLE
GROUP BY oldField having count(IDfield) > 1
)

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

Удачи.
...
Рейтинг: 0 / 0
Удаление одинаковых записей
    #32558002
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ссылку я знаю :))

Учится это значит пытаться мыслить ширше :))

А вот грабли настоящие.
...
Рейтинг: 0 / 0
Удаление одинаковых записей
    #32558012
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лентяй

)))))))) Ок
а если без ключа но вот так :

Код: plaintext
1.
2.
3.
4.
5.
6.
DELETE FROM Table
WHERE IDfield not in (    
    Select MAX(IDfield) as MaxID
    FROM TABLE
    GROUP BY oldField
)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Удаление одинаковых записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]