Начало » Использование СУБД » Firebird, HQbird, InterBase » Причудливая сортировка по условию (больше 300 условий в запросе)
Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1242] |
Sat, 07 January 2023 17:17 |
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 условий в запросе) [сообщение #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 условий в запросе) [сообщение #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 А так - примерно одна сатана. Но это всё к SQL отношения не имеет.
Сложнее если надо наоборот, игнорировать сортировку пользователя и выдавать отчёт с сортировкой по ID, не ломая визуализации. Тут без теневого запроса к мастеру не обойтись. Деталь при полной закачке на входе можно просто отцепить на время от грида, снять локальный фильтр, отсортировать, сделать отчёт от теневого мастера и вернуть всё взад.
Да, ещё чуть не забыл. При клиентской in-memory фильтрации детали при путешествиях по мастеру мы всегда будем видеть в детали картину на момент закачки на клиента, а при перечитывании в RC транзакции на текущий момент. Ни то ни другое не хорошо и не плохо само по себе, разработчик просто должен отдавать себе отчёт в том что ему нужно.
[Обновления: Mon, 09 January 2023 02:18] Известить модератора
|
|
|
|
|
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1257 является ответом на сообщение #1255] |
Mon, 09 January 2023 04:15 |
fraks
Сообщений: 140 Зарегистрирован: June 2022 Географическое положение: Новосибирск
|
Senior Member |
|
|
SD писал(а) Mon, 09 January 2023 05:48В Дельфи всё ещё не изобрели грида, показывающего какую-нибудь коллекцию у которой есть метод "CustomSort"?..
А, собсно, почему вопросы именно к гриду? На мой взгляд, сортировка - это дела датасета или чего там вместо него. А к гриду вопрос может быть только такой что бы как-то отобразить как же там задана сортировка. Но это не обязательно именно в гриде делать.
У меня свой самопальный типа динамический массив, но с динамическими колонками. Типа датасет но не датасет а массив. Собсно, даже не массив а список, т.к. все пляшет от TList. Так вот, у TList есть встроенный метод QuickSort, ему достаточно сделать функцию сравнения двух Item - и там можно задать любую сортировку.
[Обновления: Mon, 09 January 2023 04:19] Известить модератора
|
|
|
|
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1284 является ответом на сообщение #1259] |
Mon, 09 January 2023 21:21 |
shavluk
Сообщений: 82 Зарегистрирован: 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
Сообщений: 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
Пока работает
Ну что ж, трудолюбие - тоже хорошее свойство
|
|
|
|
|
|
|
Re: Причудливая сортировка по условию (больше 300 условий в запросе) [сообщение #1302 является ответом на сообщение #1301] |
Tue, 10 January 2023 23:55 |
|
Старый Плюшев
Сообщений: 95 Зарегистрирован: August 2022 Географическое положение: Ленинград
|
Member |
|
|
shavluk писал(а) Tue, 10 January 2023 22:48select 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
Да понял я, понял. Я про бритву Оккама, в смысле прекрасно получается и без изобретений Ретроград и консеватор я, в конце концов, или где
[Обновления: Wed, 11 January 2023 00:02] Известить модератора
|
|
|
|
Переход к форуму:
Текущее время: Wed Dec 18 17:15:04 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01407 секунд
|