powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перезаписать запрос
5 сообщений из 5, страница 1 из 1
Перезаписать запрос
    #40029429
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли перезаписать запрос не используя union all ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Select 'loans' as product, inn s
from potential
where type in ('SHOW', 'SHOW_FRONT')
and 1 = l_loans and calc_id = l_calc_id
group by inn having sum(abs(cltv_loan))=0
UNION ALL
Select 'loans' as product, inn s
from potential
where type in ('SHOW', 'SHOW_FRONT')
and 1 = l_acq and calc_id = l_calc_id
group by inn having sum(abs(cltv_acq))=0
UNION ALL
Select 'loans' as product, inn s
from potential
where type in ('SHOW', 'SHOW_FRONT')
and 1 = l_zp and calc_id = l_calc_id
group by inn having sum(abs(cltv_salary))=0
...
Рейтинг: 0 / 0
Перезаписать запрос
    #40029449
ASNexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x17.mstu,

Чтобы получить абсолютно аналогичный результат при любых значениях параметров - нет, нельзя.

Результат, аналогичный исходному, если бы был использован UNION , не UNION ALL , можно получить:
Код: plsql
1.
2.
3.
4.
5.
6.
Select 'loans' as product, inn s
from potential
where type in ('SHOW', 'SHOW_FRONT')
  and (1 = l_loans or 1 = l_acq or 1 = l_zp)
  and calc_id = l_calc_id
group by inn having (1 = l_loans and sum(abs(cltv_loan))=0) or (1 = l_acq and sum(abs(cltv_acq))=0) or (1 = l_zp and sum(abs(cltv_salary))=0)



При использовании UNION ALL в случае, если строка удовлетворяет условиям нескольких SELECT'ов (например, при 1 = l_loans и 1 = l_acq и выполнении других соответствующих условий) она будет выбрана больше одного раза.
При переписывании запроса в один SELECT строка может быть выбрана не более одного раза (в общем случае, если речь не идёт о чисто теоретических изысканиях возможности эмулировать результат работы UNION ALL).
...
Рейтинг: 0 / 0
Перезаписать запрос
    #40029450
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASNexus,

А есть ли вообще смысл переписывать запрос от union в один select ?
...
Рейтинг: 0 / 0
Перезаписать запрос
    #40029453
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если результат разный значит смысла переписывать запрос нет
...
Рейтинг: 0 / 0
Перезаписать запрос
    #40029660
ASNexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x17.mstu,

Если критерий целесообразности переписывания запроса только один - получить аналогичный результат, то можно попробовать, например, так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Select 'loans' as product, inn s
from potential 
     cross join (select level rn from dual connect by level <= decode(l_loans, 1, 1, 0) + decode(l_acq, 1, 1, 0) + decode(l_zp, 1, 1, 0)) rpt
where type in ('SHOW', 'SHOW_FRONT')
  and (1 = l_loans or 1 = l_acq or 1 = l_zp)
  and calc_id = l_calc_id
group by rpt.rn, l_loans, l_acq, l_zp, inn
  having (1 = l_loans and sum(abs(cltv_loan))=0 and rpt.rn = 1 )
      or (1 = l_acq and sum(abs(cltv_acq))=0 and rpt.rn = decode(l_loans, 1, 1, 0) + 1)
      or (1 = l_zp and sum(abs(cltv_salary))=0 and rpt.rn = decode(l_loans, 1, 1, 0) + decode(l_acq, 1, 1, 0) + 1)


Т.е. переписывание ради переписывания, не смотря ни на что (ни на производительность, ни на читаемость кода), тоже возможно конечно. Практического смысла в этом ни малейшего, но как ответ на поставленную задачу подойдёт :-)

Если, я правильно догадываюсь и l_loans, l_acq, l_zp - это переменные, можно их убрать из group by, а если и версия позволяет, то можно ещё и cross join заменить на cross apply.

А из каких соображений вопрос о переписывании возник изначально?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перезаписать запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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