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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2017, 10:50   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В таблице кроссов должно быть суррогатное ключевое поле, коль уникальность на уровне группы полей Бренд1, Артикул1, Бренд2, Артикул2 не поддерживается. Есть?

Если есть, то покажу на примере своей табличке YksDvig, ключевое поле YksDvig_Id и поля Bs,Ks которые буду проверять и удалять не уникальные. Здесь два, у тебя четыре, что не принципиально

Следующий запрос сгруппирует по Bs,Ks, вернет максимальный YksDvig_Id и количество в группировке
Код:
SELECT MAX(YksDvig_Id) AS YksDvig_Id,Bs,Ks,COUNT(*) AS RecCount
  FROM YksDvig
  GROUP BY Bs,Ks
Теперь его засуну вложенным в другой запрос, который вернет все, что нужно удалить. Последнее условие Y1.RecCount>1, как и вообще возврат RecCount в общем и не обязательно, поскольку Y.YksDvig_Id<>Y1.YksDvig_Id вполне достаточно
Код:
SELECT Y.*
  FROM YksDvig Y,
       (SELECT MAX(YksDvig_Id) AS YksDvig_Id,Bs,Ks,COUNT(*) AS RecCount
          FROM YksDvig
          GROUP BY Bs,Ks) Y1
  WHERE Y.Bs=Y1.Bs AND Y.Ks=Y1.Ks AND Y.YksDvig_Id<>Y1.YksDvig_Id AND Y1.RecCount>1
Теперь осталось встроить его в инструкцию DELETE
Код:
DELETE YksDvig
  FROM YksDvig Y,
       (SELECT MAX(YksDvig_Id) AS YksDvig_Id,Bs,Ks,COUNT(*) AS RecCount
          FROM YksDvig
          GROUP BY Bs,Ks) Y1
  WHERE Y.Bs=Y1.Bs AND Y.Ks=Y1.Ks AND Y.YksDvig_Id<>Y1.YksDvig_Id AND Y1.RecCount>1
проверил на сиквеле, синтаксису мускула походу не противоречит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.12.2017 в 11:27.
Аватар вне форума Ответить с цитированием
Старый 27.12.2017, 11:27   #12
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Аватар, вложением прикрепил заголовки полей таблицы.
Из бренда и артикула создаётся общее поисковое значение.
Это всё что есть.
Изображения
Тип файла: png TDM_LINKS.png (2.8 Кб, 36 просмотров)
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 27.12.2017, 11:43   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Это не все что есть. Уникальный ключ есть или нет? Code, например, случайно не уникальный ключ записи таблицы? Если в группе записей-дублей нет поля или группы полей, позволяющих однозначно идентифицировать запись, то средствами SQL удалить дубликаты и оставить только одну проблемно, хоть из программы, хоть из оболочки. В мускуле как-то limit можно прицепить, но запаришься его цеплять к куче групп-дубликатов. В сиквеле пришлось бы удалить всё из записей-дублей, запомнив предварительно инфу одной из них. Потом вставить то, что запомнил
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.12.2017, 11:52   #14
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Аватар
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Идентификация по кодам записей - части с одинаковым источником данных, где источник определяется как поле CODE.
Это буквально ВСЕ поля таблицы.
Цитата:
Сообщение от Аватар Посмотреть сообщение
удалить дубликаты и оставить только одну проблемно, хоть из программы, хоть из оболочки
Парсинг в лоб ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 27.12.2017, 11:55   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Уникальный ключ есть или нет?
Есть или нет?
Цитата:
Парсинг в лоб ?
Чего это?

Если нет, выдерни во временную таблицу сгруппированные по брендам и артикулам записи-дубли
Удали все записи-дубли используя эту временную табличку не оставляя ни одной
Вставь по одной из каждой группы дубликатов из временной таблички
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.12.2017 в 12:01.
Аватар вне форума Ответить с цитированием
Старый 27.12.2017, 12:17   #16
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Есть или нет?
Получается, что уникального ключа нет. Да и смысл, это же набор конечных данных. Это если только какой нибудь внутренний ID, в котором я не вижу никакого смысла.
Цитата:
Сообщение от Аватар Посмотреть сообщение
выдерни во временную таблицу сгруппированные по брендам и артикулам записи-дубли
Сначала их нужно найти.
Можно не парсить, а для каждой записи составить зеркальный "ключ" (что то типа кэша), а в процессе искать повторы, которые были ранее. Но как составлять ключ - я ещё не придумал.
И тем не менее, от парсинга как такового это не спасает.
P. S. Лимит по миллиону вроде грузит.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 27.12.2017 в 12:24.
OmegaBerkut вне форума Ответить с цитированием
Старый 27.12.2017, 12:48   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Сначала их нужно найти.
Ну ёлы-палы, с sql совсем плохо. Найти просто:
Код:
SELECT BKey1,AKey1,BKey2,AKey2
  FROM ТвояТаблица
  GROUP BY BKey1,AKey1,BKey2,AKey2
  HAVING COUNT(*)>1
Может еще PKey1,PKey2 засунуть по аналогии. Дальше смотри #15, там точно также все просто
Цитата:
Получается, что уникального ключа нет. Да и смысл, это же набор конечных данных. Это если только какой нибудь внутренний ID, в котором я не вижу никакого смысла.
И плохо, с ним всегда удобней. Вот тебе и пример - проблемы с удалением только одной записи из двух полностью идентичных
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.12.2017, 15:43   #18
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну ёлы-палы, с sql совсем плохо.
Да, плохо ... Для меня база данных - это средство хранения, а не обработки информации. Если движок базы позволяет добавлять-изменять-удалять информацию - это уже хорошо (не нужно напрямую в файлы БД писать). Обработка информации должна же происходить за пределами её хранилища. Гибкости всяко по больше будет.
Цитата:
Сообщение от Аватар Посмотреть сообщение
Найти просто
Алгоритм составить может и не сложно, но вот процесс его выполнения будет происходить всё дольше и дольше (чем дальше по таблице, тем дольше смотреть на то, что было уже просмотрено.

Банальный запрос
Код:
SELECT COUNT(*) FROM TDM_LINKS
	GROUP BY BKEY1,AKEY1,BKEY2,AKEY2
	HAVING COUNT(*)>1
висит в базе уже И я не контроллирую процесс выборки (не вижу никакого движения).
Мне теперь либо перезапускать сервер/базу, либо ждать результата.
Хоть выясню количество полных дублей (а мне ещё и зеркальные дубли нужно вычистить).
Либо пока не ляжет база/сервер.

P. S. За 35 минут выполнения этого запроса база не вернула ничего. И не нулевое количество (а запрашивал я количество), а просто ничего. Пошёл выполнять без COUNT.
P. P. S. За 10 минут этот запрос без COUNT так же вернул ничего.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 27.12.2017 в 16:17.
OmegaBerkut вне форума Ответить с цитированием
Старый 27.12.2017, 15:46   #19
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Но как составлять ключ - я ещё не придумал.
И сейчас на компе это проблема ... Что можете посоветовать для составления такого хэш-ключа ?
За час обработало 700 000 записей (из них уже добрая половина - дубли). А записей всего 12 миллионов.
И обработка выполняется всё медленнее и медленнее.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 27.12.2017, 16:24   #20
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
За 35 минут выполнения этого запроса база не вернула ничего
Тяжелый случай, не потому ли, что:
Цитата:
а на серваке всего 768 мегабайт
мучайся, делай неделями то, что тремя запросами, потратив на написание и отладку 10 минут, максимум час, можно выполнить за несколько минут )) Начальство не может что ли, более приличный комп под sql-сервер выделить?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
System.IO.File.Copy() компьютер вешается наглухо OmegaBerkut C# (си шарп) 13 25.02.2017 14:32
Ошибка в запросе INSERT php Godfather07 Помощь студентам 0 21.02.2012 20:57
Можно ли при пост-запросе InDy получить только куки (при логине на сайт например)? TwiX Работа с сетью в Delphi 2 07.02.2010 08:21
ошибка при запросе добавления Rin БД в Delphi 4 26.12.2009 01:41
Зависание при пост запросе Фенрир Работа с сетью в Delphi 1 14.12.2009 15:18