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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2023, 13:10   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Причудливая сортировка по условию (больше 300 условий в запросе)

Доброе время суток форумчане,

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

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

наверно приведу запрос который выдает мне результат, в том прядке, который мне нужен (нервных просьба не смотреть )
Код:
select DEVICE_ID_CL, NUMBER_CERT, DATE_OPERATION, CALIBRATION_INTERVAL, DESCRIPTION
 from CERTIFICATE
  where DEVICE_ID_CL in (473, 392, 391, 375, 553, 554, 452, 450, 192, 404, 405, 447, 124, 504, 379, 123, 284, 215, 438, 439, 214, 441, 422, 195, 421, 426, 419, 406, 196, 207,
   412, 311, 86, 269, 87, 274, 273, 38, 272, 35, 36, 37, 39, 58, 287, 43, 44, 92, 74, 435, 85, 14, 285, 264, 364, 365, 81, 83, 69, 313, 54, 48, 49, 55, 56, 50, 368, 369, 312,
    275, 271, 46, 59, 57, 19, 15, 53, 18, 52, 45, 51, 17, 5, 372, 127, 212, 266, 437, 446, 373, 194, 193, 110, 466, 361, 362, 359, 201, 106, 300, 299, 301, 303, 302, 304, 298,
     290, 436, 474, 288, 280, 204, 281, 16, 26, 295, 126, 472, 230, 413, 410, 407, 505, 297)
      and CONTROL = 1
      and DateAdd(month, CALIBRATION_INTERVAL, DATE_OPERATION) < current_date
order by DEVICE_ID_CL=473 desc, DEVICE_ID_CL=392 desc, DEVICE_ID_CL=391 desc, DEVICE_ID_CL=375 desc, DEVICE_ID_CL=553 desc, DEVICE_ID_CL=554 desc, DEVICE_ID_CL=452 desc, DEVICE_ID_CL=450 desc, DEVICE_ID_CL=192 desc, DEVICE_ID_CL=404 desc, DEVICE_ID_CL=405 desc, DEVICE_ID_CL=447 desc, DEVICE_ID_CL=124 desc, DEVICE_ID_CL=504 desc, DEVICE_ID_CL=379 desc, DEVICE_ID_CL=123 desc, DEVICE_ID_CL=284 desc, DEVICE_ID_CL=215 desc, DEVICE_ID_CL=438 desc, DEVICE_ID_CL=439 desc, DEVICE_ID_CL=214 desc, DEVICE_ID_CL=441 desc, DEVICE_ID_CL=422 desc, DEVICE_ID_CL=195 desc, DEVICE_ID_CL=421 desc, DEVICE_ID_CL=426 desc, DEVICE_ID_CL=419 desc, DEVICE_ID_CL=406 desc, DEVICE_ID_CL=196 desc, DEVICE_ID_CL=207 desc, DEVICE_ID_CL=412 desc, DEVICE_ID_CL=311 desc, DEVICE_ID_CL=86 desc, DEVICE_ID_CL=269 desc, DEVICE_ID_CL=87 desc, DEVICE_ID_CL=274 desc, DEVICE_ID_CL=273 desc, DEVICE_ID_CL=38 desc, DEVICE_ID_CL=272 desc, DEVICE_ID_CL=35 desc, DEVICE_ID_CL=36 desc, DEVICE_ID_CL=37 desc, DEVICE_ID_CL=39 desc, DEVICE_ID_CL=58 desc, DEVICE_ID_CL=287 desc, DEVICE_ID_CL=43 desc, DEVICE_ID_CL=44 desc, DEVICE_ID_CL=92 desc, DEVICE_ID_CL=74 desc, DEVICE_ID_CL=435 desc, DEVICE_ID_CL=85 desc, DEVICE_ID_CL=14 desc, DEVICE_ID_CL=285 desc, DEVICE_ID_CL=264 desc, DEVICE_ID_CL=364 desc, DEVICE_ID_CL=365 desc, DEVICE_ID_CL=81 desc, DEVICE_ID_CL=83 desc, DEVICE_ID_CL=69 desc, DEVICE_ID_CL=313 desc, DEVICE_ID_CL=54 desc, DEVICE_ID_CL=48 desc, DEVICE_ID_CL=49 desc, DEVICE_ID_CL=55 desc, DEVICE_ID_CL=56 desc, DEVICE_ID_CL=50 desc, DEVICE_ID_CL=368 desc, DEVICE_ID_CL=369 desc, DEVICE_ID_CL=312 desc, DEVICE_ID_CL=275 desc, DEVICE_ID_CL=271 desc, DEVICE_ID_CL=46 desc, DEVICE_ID_CL=59 desc, DEVICE_ID_CL=57 desc, DEVICE_ID_CL=19 desc, DEVICE_ID_CL=15 desc, DEVICE_ID_CL=53 desc, DEVICE_ID_CL=18 desc, DEVICE_ID_CL=52 desc, DEVICE_ID_CL=45 desc, DEVICE_ID_CL=51 desc, DEVICE_ID_CL=17 desc, DEVICE_ID_CL=5 desc, DEVICE_ID_CL=372 desc, DEVICE_ID_CL=127 desc, DEVICE_ID_CL=212 desc, DEVICE_ID_CL=266 desc, DEVICE_ID_CL=437 desc, DEVICE_ID_CL=446 desc, DEVICE_ID_CL=373 desc, DEVICE_ID_CL=194 desc, DEVICE_ID_CL=193 desc, DEVICE_ID_CL=110 desc, DEVICE_ID_CL=466 desc, DEVICE_ID_CL=361 desc, DEVICE_ID_CL=362 desc, DEVICE_ID_CL=359 desc, DEVICE_ID_CL=201 desc, DEVICE_ID_CL=106 desc, DEVICE_ID_CL=300 desc, DEVICE_ID_CL=299 desc, DEVICE_ID_CL=301 desc, DEVICE_ID_CL=303 desc, DEVICE_ID_CL=302 desc, DEVICE_ID_CL=304 desc, DEVICE_ID_CL=298 desc, DEVICE_ID_CL=290 desc, DEVICE_ID_CL=436 desc, DEVICE_ID_CL=474 desc, DEVICE_ID_CL=288 desc, DEVICE_ID_CL=280 desc, DEVICE_ID_CL=204 desc, DEVICE_ID_CL=281 desc, DEVICE_ID_CL=16 desc, DEVICE_ID_CL=26 desc, DEVICE_ID_CL=295 desc, DEVICE_ID_CL=126 desc, DEVICE_ID_CL=472 desc, DEVICE_ID_CL=230 desc, DEVICE_ID_CL=413 desc, DEVICE_ID_CL=410 desc, DEVICE_ID_CL=407 desc, DEVICE_ID_CL=505 desc, DEVICE_ID_CL=297 desc
Спасибо за ответ

Последний раз редактировалось KBO; 08.01.2023 в 13:14.
KBO вне форума Ответить с цитированием
Старый 08.01.2023, 13:47   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

Цитата:
Сообщение от KBO Посмотреть сообщение
Строки с ID расположены НЕ по порядку (после сортировки пользователя).
Для этого используют отдельное поле для сортировки.
Valick вне форума Ответить с цитированием
Старый 08.01.2023, 13:54   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Для этого используют отдельное поле для сортировки.
Я не знаю каким образом пользователь отсортирует строки...

т.е. это поле вычисляемое??? или
вставлять отдельное поле в базу??? и как его заполнять в таком случае?

Что вы имели в виду, можно чуть подробнее???

Последний раз редактировалось KBO; 08.01.2023 в 14:00.
KBO вне форума Ответить с цитированием
Старый 08.01.2023, 14:22   #4
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

Так стоп, давайте по порядку, что там у вас за БД?
Valick вне форума Ответить с цитированием
Старый 08.01.2023, 14:27   #5
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Так стоп, давайте по порядку, что там у вас за БД?
БД на FireBird3.0
KBO вне форума Ответить с цитированием
Старый 08.01.2023, 14:42   #6
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

http://www.ibase.ru/joins/

По идее просто соединяете первую таблицу со второй, явным join и не используете order by, раз у вас нет поля для сортировки.

Последний раз редактировалось Valick; 08.01.2023 в 14:44.
Valick вне форума Ответить с цитированием
Старый 08.01.2023, 15:04   #7
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Я конечно ничего против ваших ответов не имею,
но мне ща пришла мысля

посмотрите пожалуйста на такой вариант с использованием вычисляемого поля и сортировки по нему
Код:
select (case when DEVICE_ID_CL=473 then 1 --else null
             when DEVICE_ID_CL= 392 then 2
             when DEVICE_ID_CL= 391 then 3
             when DEVICE_ID_CL= 375 then 4
             when DEVICE_ID_CL=553 then 5
             when DEVICE_ID_CL=554 then 6
             ...
             when DEVICE_ID_CL= 297 then 663 else null end) FIELD_SORT,
DEVICE_ID_CL, NUMBER_CERT, DATE_OPERATION, CALIBRATION_INTERVAL, DESCRIPTION
 from CERTIFICATE
  where DEVICE_ID_CL in (473, 392, 391, 375, 553, 554, 452, 450, 192, 404, 405, 447, 124, 504, 379, 123, 284, 215, 438, 439, 214, 441, 422, 195, 421, 426, 419, 406, 196, 207,
   412, 311, 86, 269, 87, 274, 273, 38, 272, 35, 36, 37, 39, 58, 287, 43, 44, 92, 74, 435, 85, 14, 285, 264, 364, 365, 81, 83, 69, 313, 54, 48, 49, 55, 56, 50, 368, 369, 312,
    275, 271, 46, 59, 57, 19, 15, 53, 18, 52, 45, 51, 17, 5, 372, 127, 212, 266, 437, 446, 373, 194, 193, 110, 466, 361, 362, 359, 201, 106, 300, 299, 301, 303, 302, 304, 298,
     290, 436, 474, 288, 280, 204, 281, 16, 26, 295, 126, 472, 230, 413, 410, 407, 505, 297)
      and CONTROL = 1
      and DateAdd(month, CALIBRATION_INTERVAL, DATE_OPERATION) < current_date
order by FIELD_SORT
тут коненечно не 663 ID, но я проверял запрос в IBExpert, вроде работает

Последний раз редактировалось KBO; 08.01.2023 в 15:13.
KBO вне форума Ответить с цитированием
Старый 08.01.2023, 15:22   #8
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

Зачем?
Я так понимаю правильная последовательность строку у вас уже содержится в where вы же её откуда-то принимаете, для того что бы сформировать запрос. Просто сделайте объединение двух таблиц (join) и забудтье про запросы в циклах. Результат из БД может быть в любой последовательности, упорядочить его можно уже относительно имеющейся последовательности.
У меня нет доступа к FireBird устанавливать, настраивать и разбираться в тонкостях диалекта нет ни времени ни желания. Поэтому ответы несколько абстракные. Но сам по себе SQL он и в Африке SQL и как декларативному языку циклы ему противоестественны.
Valick вне форума Ответить с цитированием
Старый 08.01.2023, 15:33   #9
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Зачем?
...забудтье про запросы в циклах. ...
а не кто и не говорил о запросах в цикле (я не хочу "положить" сервер).
У меня всегда был один запрос (я и так против бесконтрольного числа запросов к БД, а вы еще говорите о запросе в циле), что повторяется в одном запросе, так это "case"

Да и насчет "where", если я правильно вас понял, он не поддерживает последовательность (которая указана в нем)

Последний раз редактировалось KBO; 08.01.2023 в 15:37.
KBO вне форума Ответить с цитированием
Старый 08.01.2023, 15:54   #10
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 484
По умолчанию

Цитата:
Сообщение от KBO Посмотреть сообщение
Да и насчет "where", если я правильно вас понял, он не поддерживает последовательность (которая указана в нем)
Вы эту последовательность передаёте в запрос, значит она уже у вас есть, я так полагаю она у вас хранится в массиве.
Valick вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция ЕСЛИ подходит только для 1 условия, а если условий больше? Slavatron1984 Microsoft Office Excel 2 08.01.2012 22:07
сортировка в запросе west23 Microsoft Office Access 1 19.05.2010 00:32
Как задать в формулу больше чем 7 условий IF??? xXx666 Microsoft Office Excel 2 29.10.2009 22:55
Как быть если условий больше 7? 911old Microsoft Office Excel 1 20.08.2009 16:08