powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Задачка для любителей поломать голову.
6 сообщений из 6, страница 1 из 1
Задачка для любителей поломать голову.
    #35341458
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASE 12.5.0.3
Есть денормализованая таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table code_history (
  id integer,
  year integer,
  code1 char( 6 ),
  code2 char( 6 ),
  code3 char( 6 ),
  code4 char( 6 ),
  code5 char( 6 ),
  code6 char( 6 ),
  code7 char( 6 ),
  code8 char( 6 ),
  code9 char( 6 ),
  code10 char( 6 ),
  primary key (id, year)
)
Все десять codeX полей равноправны (убил бы того кто эту таблицу сочинил, но увы)
и таблица с расшифровкой кодов:
Код: plaintext
1.
2.
3.
4.
create table codes (
   code char( 6 ) primary key,
   code_type char( 2 ),
   code_description varchar( 50 )
)


Надо выбрать из code_history те id которые в каком-то конкретном году имели одновременно два конкретных code_type.

Промежуточный, результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select code into #codeA from codes where code_type = @codeA
select code into #codeB from codes where code_type = @codeB

select id from code_history
where year = @year and (
         code1 in (select code from #codeA) or
         code2 in (select code from #codeA) or
         code3 in (select code from #codeA) or
         code4 in (select code from #codeA) or
         code5 in (select code from #codeA) or
         code6 in (select code from #codeA) or
         code7 in (select code from #codeA) or
         code8 in (select code from #codeA) or
         code9 in (select code from #codeA) or
         code10 in (select code from #codeA)
     ) and (
         code1 in (select code from #codeB) or
         code2 in (select code from #codeB) or
         code3 in (select code from #codeB) or
         code4 in (select code from #codeB) or
         code5 in (select code from #codeB) or
         code6 in (select code from #codeB) or
         code7 in (select code from #codeB) or
         code8 in (select code from #codeB) or
         code9 in (select code from #codeB) or
         code10 in (select code from #codeB)
     )
Этот запрос выдает точно то, что нужно, но к сожалению, он не влазит в ограничения сервера. Напоминаю что у меня ASE 12.5.0.3 и у него ограничение в 16 подзапросов. Если выкинуть обработку двух последних полей (code9 и code20) то как раз вместо 20 подзапросов получаем 16 и все начинает работать, но ...

Итак, вопрос: Как можно (и можно ли вообще) решить эту задачу без union'ов?
...
Рейтинг: 0 / 0
Задачка для любителей поломать голову.
    #35341472
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, стоило опубликовать задачку, как сам сообразил как обойти эти дурные ограничения в 16 подзапросов.
...
Рейтинг: 0 / 0
Задачка для любителей поломать голову.
    #35341800
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
select id from code_history
where year = @year
    and @codeA in (code1, code2, code3, code4, code5, code6, code7, code8, code9, code10)
    and @codeB in (code1, code2, code3, code4, code5, code6, code7, code8, code9, code10)
...
Рейтинг: 0 / 0
Задачка для любителей поломать голову.
    #35343974
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golsa
Код: plaintext
1.
2.
3.
4.
select id from code_history
where year = @year
    and @codeA in (code1, code2, code3, code4, code5, code6, code7, code8, code9, code10)
    and @codeB in (code1, code2, code3, code4, code5, code6, code7, code8, code9, code10)
Не, ты не понял задачу. Параметры это не сами кода, это типы кодов. Наверное надо было их назвать @Code_Type_A и @Code_Type_B. В полуработающем примере я ж не просто так делаю две временных таблицы.
...
Рейтинг: 0 / 0
Задачка для любителей поломать голову.
    #35344653
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, согласен. Но так должно пройти

Код: plaintext
1.
2.
3.
4.
select id from code_history
where year = @year 
   and exists (select code from #codeA where code in (code1, code2, code3, code4, code5, code6, code7, code8, code9, code10)) 
   and exists (select code from #codeB where code in (code1, code2, code3, code4, code5, code6, code7, code8, code9, code10)) 
...
Рейтинг: 0 / 0
Задачка для любителей поломать голову.
    #35346395
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golsaДа, согласен. Но так должно пройти

Код: plaintext
1.
2.
3.
4.
select id from code_history
where year = @year 
   and exists (select code from #codeA where code in (code1, code2, code3, code4, code5, code6, code7, code8, code9, code10)) 
   and exists (select code from #codeB where code in (code1, code2, code3, code4, code5, code6, code7, code8, code9, code10)) 
Nice!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Задачка для любителей поломать голову.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]