SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Причудливая сортировка по условию (больше 300 условий в запросе)
Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1242] Sat, 07 January 2023 17:17 Переход к следующему сообщению
Konstantin-78 в настоящее время не в онлайне  Konstantin-78
Сообщений: 4
Зарегистрирован: January 2023
Junior Member
Доброе время суток форумчане,

Есть выполненный запрос с таблицы 1 DataSet1), в котором у каждой строки (а их более 300) есть ID. Строки с ID расположены НЕ по порядку (после сортировки пользователя).
Есть таблица 2, в которой строки привязаны к таблице 1 (по ID), т.е. связь один ко многим.
Вопрос:
Каким образом, можно не дергая заново запрос к таблице 1 DataSet1), выполнить выборку из таблицы 2 (DataSet2), чтобы записи в DataSet2, были упорядочены в порядке поля ID (DataSet1). (Чтоб вывести информацию в Word, на основании результатов в двух DataSet).
Конструкции «order by» или «union all» не помогают, т.к. они расчитаны только до 255 параметров (строк результата), т.е выпадает ошибка. А у меня больше 300 строк в результате.

Можно конечно без сортировки, но тогда мне придется делать 300 циклов в DataSet2 (чтоб соотнести строки с двух DataSet), это как-то не очень хотелось бы…

Спасибо за ответ
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1243 является ответом на сообщение #1242] Sat, 07 January 2023 18:44 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
Сегодня вроде Рождество, а не первое апреля Shocked
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1251 является ответом на сообщение #1243] Sun, 08 January 2023 22:35 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
Пожалуй я вчера был несколько резковат от общего расстройства нервов. Сегодня я добрый и попробую тряхнуть стариной, поскольку, как я понимаю, Вы человек девственный, как Мастер говорил поэту Ивану Бездомному.

Так вот, во-первых, вьюноша, набор данных никогда не упорядочен по какому-либо ID если в запросе нет order by по этому ID. Сортировка чисто случайная. На практике в простейших запросах частенько таки выглядит что результат отсортирован по ID, но это случайность. Которая, как известно, есть проявление закономерности, но что это за закономерность мы сейчас рассматривать не будем, просто запомните, что полагаться на это не стоит.

Во-вторых, какое отношение имеет количество строк в мастере к сортировке данных по столбцам в детали? Мастер-деталь - это сленговое название приёма визуализации отношения 1:n в двух многострочных контролах, именуемых гридами. К SQL это никакого отношения не имеет. Так вот, ну ни малейшего. Слова "строка" и "столбец" - чувствуете разницу?

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

Посему постановка задачи вызывает просто оторопь и желание отбежать подальше. Я так и не смог понять что Вам, собственно, нужно, но имею сильное подозрение, абстрагируясь от трёхсот условий сортировки, что нужна банальнейшая схема - запрос к детали параметризован (это в where) по ID мастера, то есть в каждый конкретный момент грид детали содержит данные, соответствующие только текущей строке мастера, независимо от всяких прочих сортировок, и если нужен полный перебор, то он осуществляется циклом до EOF по мастеру, внутри которого цикл до EOF по соответствующему фрагменту детали. И опять же это никакого отношения к SQL не имеет, чисто организация клиентского приложения. Это же относится и к случаю если я понял неправильно.
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1252 является ответом на сообщение #1251] Sun, 08 January 2023 22:49 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 56
Зарегистрирован: July 2022
Member
Старый Плюшев писал(а) Sun, 08 January 2023 22:35
Я так и не смог понять что Вам, собственно, нужно
Насколько я понял задачу, у него пользователь вручную отсортировал мастер (произвольной перестановкой строк). Теперь надо получить отчет, учитывающий эту перестановку.

Сделать такое проще всего на клиенте, а не запросом к серверу. Например, чтобы Деталь при скроллинге по Мастеру не делала запрос к базе, а использовала локальную фильтрацию (на клиенте).
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1253 является ответом на сообщение #1252] Mon, 09 January 2023 00:07 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
ggreggory писал(а) Sun, 08 January 2023 22:49
Старый Плюшев писал(а) Sun, 08 January 2023 22:35
Я так и не смог понять что Вам, собственно, нужно
Насколько я понял задачу, у него пользователь вручную отсортировал мастер (произвольной перестановкой строк). Теперь надо получить отчет, учитывающий эту перестановку.

Сделать такое проще всего на клиенте, а не запросом к серверу. Например, чтобы Деталь при скроллинге по Мастеру не делала запрос к базе, а использовала локальную фильтрацию (на клиенте).
Это не принципиально при 300 строках в мастере, можно и на клиенте. Если ожидается многократное скроллирование туда-сюда мастера, то да, лучше на клиенте. Если нет и там на каждую строку в мастере стопицот в детали, то надо смотреть когда память на клиенте треснет или что лучше подождать - один раз минуту пока всё на открытии формы засосётся или секунду 300 раз при закачке порции по primary key Smile А так - примерно одна сатана. Но это всё к SQL отношения не имеет.

Сложнее если надо наоборот, игнорировать сортировку пользователя и выдавать отчёт с сортировкой по ID, не ломая визуализации. Тут без теневого запроса к мастеру не обойтись. Деталь при полной закачке на входе можно просто отцепить на время от грида, снять локальный фильтр, отсортировать, сделать отчёт от теневого мастера и вернуть всё взад.

Да, ещё чуть не забыл. При клиентской in-memory фильтрации детали при путешествиях по мастеру мы всегда будем видеть в детали картину на момент закачки на клиента, а при перечитывании в RC транзакции на текущий момент. Ни то ни другое не хорошо и не плохо само по себе, разработчик просто должен отдавать себе отчёт в том что ему нужно.

[Обновления: Mon, 09 January 2023 02:18]

Известить модератора

Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1255 является ответом на сообщение #1253] Mon, 09 January 2023 01:48 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 328
Зарегистрирован: August 2022
Senior Member
В Дельфи всё ещё не изобрели грида, показывающего какую-нибудь коллекцию у которой есть метод "CustomSort"?..
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1256 является ответом на сообщение #1255] Mon, 09 January 2023 02:21 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
SD писал(а) Mon, 09 January 2023 01:48
В Дельфи всё ещё не изобрели грида, показывающего какую-нибудь коллекцию у которой есть метод "CustomSort"?..
Я без понятия, у меня Дельфи аж 5 с компонентами от InfoPower Smile Но уже в ней изобрели T(ww)ClientDataset Wink
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1257 является ответом на сообщение #1255] Mon, 09 January 2023 04:15 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 108
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
SD писал(а) Mon, 09 January 2023 05:48
В Дельфи всё ещё не изобрели грида, показывающего какую-нибудь коллекцию у которой есть метод "CustomSort"?..
А, собсно, почему вопросы именно к гриду? На мой взгляд, сортировка - это дела датасета или чего там вместо него. А к гриду вопрос может быть только такой что бы как-то отобразить как же там задана сортировка. Но это не обязательно именно в гриде делать.

У меня свой самопальный типа динамический массив, но с динамическими колонками. Типа датасет но не датасет а массив. Собсно, даже не массив а список, т.к. все пляшет от TList. Так вот, у TList есть встроенный метод QuickSort, ему достаточно сделать функцию сравнения двух Item - и там можно задать любую сортировку.

[Обновления: Mon, 09 January 2023 04:19]

Известить модератора

Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1259 является ответом на сообщение #1257] Mon, 09 January 2023 13:39 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время в онлайне  МП
Сообщений: 768
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
fraks
А, собсно, почему вопросы именно к гриду? На мой взгляд, сортировка - это дела датасета или чего там вместо него. А к гриду вопрос может быть только такой что бы как-то отобразить как же там задана сортировка. Но это не обязательно именно в гриде делать.
концепция "в гриде данных нет!"тм объявлена deprecated.
вся прогрессивная общественность, внезапно оторванная от сиськи, дрочит теперь на NET UI Controls и прочий всякий uniGUI, где грид таки контейнер, со всякими бл#дскими сортировками и прочим "непотребством".
а для Delphi есть QuantumGrid с аналогичным функцЫоналом от DevExpress и его наследники.

зы: лично не использую, но сопровождать приходится.
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1284 является ответом на сообщение #1259] Mon, 09 January 2023 21:21 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 65
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
Перед вьіполнением запроса по детайлу, собирай все ID из мастера в строку в нужном порядке.
Раздели их каким-нибудь символом, например '~'. В итоге у тебя будет строка вида '~100~1~3~2~7~100500~'
Далее в order by детайла сортируй по условию "position('~'||ID_MASTER||'~' in cast(:order_string as varchar(3000))"

P.S. Тильду в строки сую благодаря Деду еще с эпсилона

[Обновления: Mon, 09 January 2023 21:24]

Известить модератора

Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1286 является ответом на сообщение #1252] Mon, 09 January 2023 23:21 Переход к предыдущему сообщениюПереход к следующему сообщению
Konstantin-78 в настоящее время не в онлайне  Konstantin-78
Сообщений: 4
Зарегистрирован: January 2023
Junior Member
В общем, всё сошлось на "case" в запросе (Dataset2), временном поле и сортировке по этому полю

select (case when DEVICE_ID_CL = 473 then 1 
             when DEVICE_ID_CL = 392 then 2
             when DEVICE_ID_CL = 510 then 3  
             ... 
             when DEVICE_ID_CL = 297 then 663 else null end) FIELD_SORT, 
DEVICE_ID_CL, NUMBER_CERT, DATE_OPERATION, CALIBRATION_INTERVAL, DESCRIPTION from CERTIFICATE ... order by FIELD_SORT
т.о. я получаю данные в Dataset2, сформировнные как мне нужно (учитывая ID), относительно Dataset1
Пока работает

[Обновления: Mon, 09 January 2023 23:26]

Известить модератора

Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1287 является ответом на сообщение #1286] Mon, 09 January 2023 23:47 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
Konstantin-78 писал(а) Mon, 09 January 2023 23:21
В общем, всё сошлось на "case" в запросе (Dataset2), временном поле и сортировке по этому полю

select (case when DEVICE_ID_CL = 473 then 1 
             when DEVICE_ID_CL = 392 then 2
             when DEVICE_ID_CL = 510 then 3  
             ... 
             when DEVICE_ID_CL = 297 then 663 else null end) FIELD_SORT, 
DEVICE_ID_CL, NUMBER_CERT, DATE_OPERATION, CALIBRATION_INTERVAL, DESCRIPTION from CERTIFICATE ... order by FIELD_SORT
т.о. я получаю данные в Dataset2, сформировнные как мне нужно (учитывая ID), относительно Dataset1
Пока работает
Ну что ж, трудолюбие - тоже хорошее свойство Smile
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1288 является ответом на сообщение #1287] Tue, 10 January 2023 01:46 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 328
Зарегистрирован: August 2022
Senior Member
Как обычно: "не умеешь работать головой - работай руками". Благо предельный размер запроса довели до десяти мегабайт, а быстродействие можно и железом закидать.
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1298 является ответом на сообщение #1286] Tue, 10 January 2023 15:17 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 65
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
Я же тебе показал как обойтись без таких монструозных конструкций. Но трудолюбие хорошее дело, да
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1299 является ответом на сообщение #1298] Tue, 10 January 2023 17:54 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
shavluk писал(а) Tue, 10 January 2023 15:17
Я же тебе показал как обойтись без таких монструозных конструкций. Но трудолюбие хорошее дело, да
Да там всё вообще как мычание коровы, без приёмов. Если отчёт типа с подзаголовками в виде строк из первой таблицы, то проход по мастер-детали, если просто соединения строки из первой и второй в одну с дублированием начала строки столько раз сколько есть под первую записей во второй, то джойн. Если нужны и те из первой, у которых нет деток во второй, то левый.
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1301 является ответом на сообщение #1299] Tue, 10 January 2023 22:48 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 65
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
select position('~'||DEVICE_ID_CL||'~' in '~473~392~510~....663~') FIELD_SORT,
DEVICE_ID_CL, NUMBER_CERT, DATE_OPERATION, CALIBRATION_INTERVAL, DESCRIPTION from CERTIFICATE ... order by 1
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1302 является ответом на сообщение #1301] Tue, 10 January 2023 23:55 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
shavluk писал(а) Tue, 10 January 2023 22:48
select position('~'||DEVICE_ID_CL||'~' in '~473~392~510~....663~') FIELD_SORT,
DEVICE_ID_CL, NUMBER_CERT, DATE_OPERATION, CALIBRATION_INTERVAL, DESCRIPTION from CERTIFICATE ... order by 1
Да понял я, понял. Я про бритву Оккама, в смысле прекрасно получается и без изобретений Smile Ретроград и консеватор я, в конце концов, или где Very Happy

[Обновления: Wed, 11 January 2023 00:02]

Известить модератора

Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1460 является ответом на сообщение #1302] Tue, 24 January 2023 19:40 Переход к предыдущему сообщению
DarkMaster в настоящее время не в онлайне  DarkMaster
Сообщений: 33
Зарегистрирован: August 2022
Member
Ну так бродит же по сообществу процедурка STRING_TO_COLUMN(). Строку в колонку + for select.... Хотя может не понял вопроса - заранее сорри, если что.
Предыдущая тема: FB3 как правильно использовать embedded?
Следующая тема: IBX: буферизация записей
Переход к форуму:
  


Текущее время: Thu Mar 28 17:03:24 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01031 секунд