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

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

...одинаковых записей.. [D7, IB6.x]


_Narayan_ ©   (2003-06-17 14:50:00) 

В таблице есть несколько одинаковых записей.
Как удалить одну из них?


_Narayan_   (2003-06-17 23:25:00) [1]

Спасибо, Romkin.

..остальные как обычно..


Johnmen   (2003-06-17 17:44:00) [2]

>Sandman25 © (17.06.03 16:59)
>ибо смысла сие не имеет.

Вот и я про то же...:)


Sandman25   (2003-06-17 16:59:00) [3]

Johnmen © (17.06.03 16:31)

Я невнимательно прочел :( ибо смысла сие не имеет.
Тогда только через RDB$DB_KEY


Johnmen   (2003-06-17 16:31:00) [4]

>Sandman25 © & ALL

Ну, уважаемые ! В вопросе же четко сказано, что удалить одну, а не все дубликаты !!!


Sandman25   (2003-06-17 16:19:00) [5]

>Есть и другие варианты

Другие варианты задействуют идентификаторы строки (RowId в Informix, в IB должен быть аналог).


Romkin   (2003-06-17 16:14:00) [6]

Короче:
http://www.ibase.ru/devinfo/deldupes.htm


Sandman25   (2003-06-17 16:12:00) [7]


CREATE TABLE copy_table
( name CHAR(10),
family CHAR(23));
INSERT INTO copy_table
SELECT DISTINCT *
FROM table1
WHERE name IN ("Sasha", "Vasya", "Petya");
DELETE FROM table1
WHERE name IN ("Sasha", "Vasya", "Petya");
INSERT INTO table1
SELECT *
FROM copy_table;
DROP TABLE copy_table;

Если у нас таких повторяющихся строк не пару наборов, а много, то
CREATE TABLE copy_table
( name CHAR(10),
family CHAR(23));
INSERT INTO copy_table
SELECT DISTINCT *
FROM table1;
DELETE FROM table1;
INSERT INTO table1
SELECT *
FROM copy_table;
DROP TABLE copy_table;

Если у нас таких повторяющихся строк не много, а очень много, то
CREATE TABLE copy_table
( cnt INT,
name CHAR(10),
family CHAR(23));
INSERT INTO copy_table
SELECT COUNT(*),*
FROM table1
GROUP BY 2,3
HAVING COUNT(*) > 1;
DELETE FROM table1
WHERE EXISTS
(SELECT *
FROM copy_table
WHERE table1.name = name
AND table1.family = family
);

INSERT INTO table1
SELECT *
FROM copy_table;
DROP TABLE copy_table;


stone   (2003-06-17 15:19:00) [8]


> >Sandman25 © (17.06.03 15:05)
> >Скопируйте куда-нибудь с помощью Distinct (INSERT INTO
>
> >copy_table SELECT DISTINCT * FROM table1), потом удалите
> все
> >записи и скопируйте строку из copy_table обратно.


Есть и другие варианты. Приведенный вариант подходит для работы только с небольшими объемами данных.


Johnmen   (2003-06-17 15:13:00) [9]

>Sandman25 © (17.06.03 15:05)
>Скопируйте куда-нибудь с помощью Distinct (INSERT INTO
>copy_table SELECT DISTINCT * FROM table1), потом удалите все
>записи и скопируйте строку из copy_table обратно.

И что ?


Sandman25   (2003-06-17 15:05:00) [10]

Скопируйте куда-нибудь с помощью Distinct (INSERT INTO copy_table SELECT DISTINCT * FROM table1), потом удалите все записи и скопируйте строку из copy_table обратно.
Но вообще-то, см.Anatoly Podgoretsky © (17.06.03 14:58),
база некорректно спроектирована, тем более на InterBase, который имеет мощные средства поддержки целостности данных.


Johnmen   (2003-06-17 14:59:00) [11]

А почему только одну ?


Anatoly Podgoretsky   (2003-06-17 14:58:00) [12]

Как можно работать без первичного ключа.


Наверх

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