Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2013, 10:53   #1
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию Удалить дублирующие записи

Здравствуйте! Вот нашел код на одном форуме для удаления дублирующих записей, но он почему-то не работает.
Код:
DELETE FROM matches2 WHERE id NOT IN (SELECT MIN(id)) FROM matches2 GROUP BY team2,team2
Подставил свои значения (имя таблицы и полей).
Поля:
id- счетчик
team1- текст
score1- числовой
team2- текст
score2- числовой
date- дата
helpkz вне форума Ответить с цитированием
Старый 11.04.2013, 11:05   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Так запрос же кривой у Вас!
Насколько я понимаю, он вообще не должен запускаться!

во-первых, дублирующими Вы считаете записи у которых совпадают КАКИЕ из перечисленных полей?!

во-вторых,
если, считать дублирующими записями те, у которых совпадает team1, team2, score1, score2
тогда попробуйте так
Код:
DELETE FROM matches2 
  WHERE id NOT IN 
     ( SELECT MIN(id) FROM matches2 GROUP BY team1, team2, score1, score2 )

Последний раз редактировалось Serge_Bliznykov; 11.04.2013 в 11:09.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2013, 11:09   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
он почему-то не работает
А почему ему работать, если там синтаксическая ошибка? Перетащи лишнюю скобку после MIN(id) в конец запроса. Да и поосторожней с такими запросами, ненароком и нужное удалишь
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.04.2013, 12:07   #4
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, дублирующими Вы считаете записи у которых совпадают КАКИЕ из перечисленных полей?!
Поля: team1, team2. Остальные - не важно.
helpkz вне форума Ответить с цитированием
Старый 11.04.2013, 12:12   #5
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А почему ему работать, если там синтаксическая ошибка? Перетащи лишнюю скобку после MIN(id) в конец запроса. Да и поосторожней с такими запросами, ненароком и нужное удалишь
спасибо за предупреждение. Просто я этот синтаксис не очень понимаю.
Вот поставил кнопку после matches2, "Невозможна группировка по полям выбранных с помошью *". Это наверное где-то поля нужно указать?
helpkz вне форума Ответить с цитированием
Старый 11.04.2013, 12:20   #6
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
тогда попробуйте так
Код:
DELETE FROM matches2 
  WHERE id NOT IN 
     ( SELECT MIN(id) FROM matches2 GROUP BY team1, team2, score1, score2 )
Работает! Только я убрал score1, score2 в GROUP BY. Ничего страшного?
helpkz вне форума Ответить с цитированием
Старый 11.04.2013, 12:50   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от helpkz
Работает! Только я убрал score1, score2 в GROUP BY. Ничего страшного?
отвечаю Вам вашими же словами:
Цитата:
Сообщение от helpkz
Поля: team1, team2. Остальные - не важно.
раз остальные неважно - значит, всё правильно сделали.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2013, 13:16   #8
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
отвечаю Вам вашими же словами:

раз остальные неважно - значит, всё правильно сделали.
ну тогда спасибо
А количество удаленных записей можно узнать через: Datasource.Dataset.Recordcount?
helpkz вне форума Ответить с цитированием
Старый 11.04.2013, 13:28   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
А количество удаленных записей можно узнать через: Datasource.Dataset.Recordcount?
ну, только если Вы запомните, сколько было RecordCount ДО удаления, и вычтите тот RecordCount, который станет ПОСЛЕ выполнения удаления.

а ещё, можно ДО удаления посчитать количество записей, попадающих под "чистку":
Код:
SELECT count(*) as CntForDel FROM matches2 
  WHERE id NOT IN 
     ( SELECT MIN(id) FROM matches2 GROUP BY team1, team2 )
Если до удаления выполнить данный запрос, то переменная CntForDel будет содержать количество удаляемых записей.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить записи из таблицы, если дата в записи старше 30 дней Aleksandr БД в Delphi 10 28.03.2013 21:33
Дублирующие запиcи в ComboBox Siluet Общие вопросы Delphi 13 27.06.2011 14:17
Удалить записи в форме Swatch Microsoft Office Access 2 22.02.2010 16:57
Не могу удалить записи. Хитрец БД в Delphi 13 02.02.2009 22:28
Удалить 2 записи. ADO... Roof БД в Delphi 9 18.08.2008 20:32