Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MySQL]Удаление одинаковых элементов в таблице 
:(
    Опции темы
=Женек=
Дата 23.1.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Господа, вопрос образовался.
Есть таблица, достаточно большая, в которой в результате ошибки программы каждая строка оказалась в двойном экземпляре.
Что то вроде
1234 Иванов
1234 Иванов
3421 Петров
3421 Петров
3221 Сидоров
3221 Сидоров

Как мне поудалять двойников, то есть оставить по подному экземпляру?
Вручную - замучаюсь, там около 700 строк.
PM MAIL   Вверх
ivashkanet
Дата 23.1.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



=Женек=, а есть хоть что-то чем эти строки отличаются?
Должен же быть праймари кей?

Если есть, то можно предложить следующее:
Id        Num        Name
1        1234      Иванов
2        1234      Иванов
3        3421      Петров
4        3421      Петров
5        3221      Сидоров
6        3221      Сидоров

Код

DELETE FROM table1
 WHERE id IN
       (SELECT MAX(id) FROM table1 GROUP BY num, "name" HAVING COUNT(*) = 2)


Если же уникального идентефикатора у строки нет, то могу предложить хак или бум ждать более опытных sql-щиков.

Хак:

Код

create table temp_table1
(num    number,
 "name"     varchar2(20));

insert into temp_table1
(select distinct num, "name" from table1);

delete from table1
where 1=1;

insert into table1
(select num, "name" from temp_table1);

drop temp_table1;


P.S. Все эскюэли писались тут же, так что их, возможно, нужно доработать напильником
PM MAIL WWW ICQ   Вверх
sTa1kEr
Дата 23.1.2008, 14:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: нет
Всего: 146



Если есть примари кей, то можно так же удалить следующим образом:
Код

DELETE `someTable`
FROM `someTable` t1, `someTable` t2 
WHERE t1.Num=t2.Num AND t1.Name=t2.Name AND t1.Id < t2.Id


Если нету, то, видимо, только воспользовавшись хаком ivashkanet smile Единственное, создать лучше временную таблицу, а вместо delete использовать truncate. И еще создание таблицы и инсерт можно объединить.
Код

CREATE TEMPORARY TABLE `uniquValues`
SELECT DISTINCT *
FROM `someTable`;

TRUNCATE TABLE `someTable`;

INSERT INTO `someTable`
SELECT * FROM `uniquValues`;

PM MAIL   Вверх
Bulat
Дата 28.1.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Сталкивался с такой проблемой, решал с помощью новой таблицы, куда инсертил данные с помощью параметра IGNORE, и селектом из старой. Но все же, необошлось и без ключей. Т.е. создание уникального ключа из группы полей. А IGNORE как раз позволяет инсертит все, без останов при каждом совпадении.


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
today
Дата 14.4.2008, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 14.4.2008

Репутация: нет
Всего: нет



Привет, у меня в базе только одно поле может повторяться - flvdoname, остальное все разное
Есть примари кей VID 1,2,3....
Нужно удалить строки, где flvdoname повторяется

Код

DELETE FROM video
 WHERE VID IN
       (SELECT MAX(VID) FROM video GROUP BY flvdoname, "flvdoname" HAVING COUNT(*) = 2)

Дает мне #1093 - You can't specify target table 'video' for update in FROM clause 

Код

DELETE `video`
FROM `video` t1, `video` t2 
WHERE t1.flvdoname=t2.flvdoname AND t1.VID < t2.VID

Дает мне #1109 - Unknown table 'video' in MULTI DELETE 

Помогите пожалуйста, нужно тоже подчистить базу
PM MAIL   Вверх
skyboy
Дата 14.4.2008, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(today @  14.4.2008,  01:59 Найти цитируемый пост)
#1109 - Unknown table 'video' in MULTI DELETE 

если ты объявляешь псевдонимы для таблиц(а ты их объявляешь - "t1" и "t2"), ты должен использовать псевдонимы, а не оригинальное название.
т.о. запрос должен выглядеть следующим образом:
Код

DELETE `t1`
FROM `video` t1, `video` t2 
WHERE t1.flvdoname=t2.flvdoname AND t1.VID < t2.VID

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.