powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как бы переписать запрос ?
9 сообщений из 9, страница 1 из 1
Как бы переписать запрос ?
    #39491630
nxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть запрос вида

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select *
from table_1 t1
,table_2 t2
,(
 select t3_id
       ,sum(a) as aa
       ,sum(b) as bb
       ,count(*) as cc
 from table_3
 group by t3_id
) t3
where t1.id = t2.id
and t1.t3_id = t3.t3_id



проблема в том что по table_3 происходит фуллскан, что плохо (хотя и понятно)
данные здесь должны фильтроваться по table_1
гарантируется что в table_1 никогда не больше 10 записей

можно конечно развернуть t3 наружу, но делать этого совсем не хочется
(в реальности запрос побольше)

хочется что-то вроде прокидывания предикатов, но проблема в том что предикатов тут нет

есть ли какие варианты ?

можно конечно вынести в функцию или продублировать джойны внутри, но всё это не красиво

у меня ощущение что какой-то фичи я не знаю
вобщем, посоветуйте что-нибудь
...
Рейтинг: 0 / 0
Как бы переписать запрос ?
    #39491635
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
nxxхочется что-то вроде прокидывания предикатов, но проблема в том что предикатов тут нетпредикаты джойна - тоже предикаты, они и могут пропихиваться :) а вообще есть еще латералы
...
Рейтинг: 0 / 0
Как бы переписать запрос ?
    #39491637
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Предикат таки есть - это "t1.t3_id = t3.t3_id"
что с учетом "гарантируется что в table_1 никогда не больше 10 записей"
может быть неплохим вариантом при достаточной селективности и наличии подходящего индекса.
2. Если же хочется "фичу", то materialized view + query rewrite
...
Рейтинг: 0 / 0
Как бы переписать запрос ?
    #39491641
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nxxпродублировать джойны внутри, но всё это не красиво
не джоин, но должно помочь
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select *
from table_1 t1
,table_2 t2
,(
 select t3_id
       ,sum(a) as aa
       ,sum(b) as bb
       ,count(*) as cc
 from table_3 t33
  where exists(select null from table_1 t11 where t11.t3_id = t33.t3_id)
 group by t3_id
) t3
where t1.id = t2.id
and t1.t3_id = t3.t3_id
...
Рейтинг: 0 / 0
Как бы переписать запрос ?
    #39491643
nxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nxx
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select *
from table_1 t1
,table_2 t2
,(
 select t3_id
       ,sum(a) as aa
       ,sum(b) as bb
       ,count(*) as cc
 from table_3
 group by t3_id
) t3
where t1.id = t2.id
and t1.t3_id = t3.t3_id




по факту у меня тут ошибка
сорри

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select *
from table_1 t1
,table_2 t2
,(
 select t3_id
       ,sum(a) as aa
       ,sum(b) as bb
       ,count(*) as cc
 from table_3
 group by t3_id
) t3
where t1.id = t2.id
and t2.t3_id = t3.t3_id -- тут


правильно должно быть так
...
Рейтинг: 0 / 0
Как бы переписать запрос ?
    #39491646
nxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderа вообще есть еще латералы

я об этом подумал, но у меня 11G
...
Рейтинг: 0 / 0
Как бы переписать запрос ?
    #39491647
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nxx,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select *
from table_2 t2,
table_1 t1
cross apply
(select sum(a) as aa
       ,sum(b) as bb
       ,count(*) as cc
 from table_3
where t1.t3_id = table_3.t3_id

) t3
where t1.id = t2.id
...
Рейтинг: 0 / 0
Как бы переписать запрос ?
    #39491649
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey.Lне джоин
Код: plsql
1.
2.
 from table_3 t33
  where exists(select null from table_1 t11 where t11.t3_id = t33.t3_id)


Это может быть фильтр, может - полусоединение, но помогать не обязано.
...
Рейтинг: 0 / 0
Как бы переписать запрос ?
    #39491703
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nxx,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with r as (select t1.*, t2.*,
(
 select lpad(sum(a), 50, ' ') || lpad(sum(b), 50, ' ') || lpad(count(*), 50, ' ') as aa_bb_cc
 from table_3 t3
where t2.t3_id = t3.t3_id
) 
from table_1 t1
,table_2 t2
where t1.id = t2.id)
select r.*,
  to_number(substr(aa_bb_cc, 1, 50)) as aa
  to_number(substr(aa_bb_cc, 51, 50)) as bb
  to_number(substr(aa_bb_cc, 101, 50)) as cc
 from r
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как бы переписать запрос ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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