| Начало » Использование СУБД » 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 Сообщений: 152
 Зарегистрирован: 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 Сообщений: 88
 Зарегистрирован: 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), временном поле и сортировке по этому полю 
 
 т.о. я получаю данные в Dataset2, сформировнные как мне нужно (учитывая ID), относительно Dataset1
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Пока работает
 [Обновления: 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), временном поле и сортировке по этому полюНу что ж, трудолюбие - тоже хорошее свойство
 
 т.о. я получаю данные в Dataset2, сформировнные как мне нужно (учитывая ID), относительно Dataset1
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Пока работает
   |  
	|  |  |  
	|  |  
	|  |  
	|  |  
	|  |  
	| 
		
			| 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
  Ретроград и консеватор я, в конце концов, или где   [Обновления: Wed, 11 January 2023 00:02] Известить модератора |  
	|  |  |  
	|  | 
 
 
 Текущее время: Fri Oct 31 23:30:02 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.01731 секунд |