-
DelphiN! (22.12.10 09:08) [0]Доброго времени суток!
Помогите оптимизировать следующий запрос
select
cast(time_ as date),
(select first 1 period_ from periodi where cast(time_ as date) = cast(MAIN.time_ as date)),
(select sum(summ_) from casebase where
(period_ = (select first 1 period_ from periodi where cast(time_ as date) = cast(MAIN.time_ as date))))"SUM"
from casebase MAIN
where
time_ > '01.12.2010' and time_ < '20.12.2010' and prim_ <> 'Login activated' and prim_ <> 'Login deactivated'
and prim_ <> 'OUT' and prim_ <> 'BONUS'
group by 1
order by 1
Можно ли из него сделать что-то наподобие
select
cast(time_ as date),
(select first 1 period_ from periodi where cast(time_ as date) = cast(MAIN.time_ as date)),
(select sum(summ_) from casebase where
(period_ = MAIN.2))"SUM"
from casebase MAIN
where
time_ > '01.12.2010' and time_ < '20.12.2010' and prim_ <> 'Login activated' and prim_ <> 'Login deactivated'
and prim_ <> 'OUT' and prim_ <> 'BONUS'
group by 1
order by 1
То есть не делать повторный под запрос а указать условие period_ = "тому что в столбце 2" -
Виталий Панасенко (22.12.10 09:14) [1]execute block?
-
DelphiN! (22.12.10 09:18) [2]
> Виталий Панасенко (22.12.10 09:14) [1]
> execute block?
А можно пример? -
гораздо существеннее выигрыш будет если внутренние под запросы будут использовать индексы. для чего убрать вычисления для сравниваемого поля (ведь cast(time_ as date) это "обрезание" времени из дататайма, правильно понял? или там строка потому как дальше условие со строкой (это не авто преобразование?) тогда сменить тип поля)
-
Виталий Панасенко (22.12.10 10:55) [4]execute block - аналог ХП.. только без модификации метаданных БД(ничего создавать не нужно, как в случае с хранимой процедурой)
-
evvcom © (31.12.10 14:24) [5]Как все любят делать для вычисления поля дополнительный селект, возвращающий одно значение! Чем джойны не устраивают? Я не профи в птичке, но в оракле делаю примерно так:
select
cast(MAIN.time_ as date), -- не меняю, может и так
per.period_
-- прочие поля
from casebase MAIN
left join (
select distinct
period_,
cast(time_ as date) as time_
from periodi) per
on per.time_ = cast(MAIN.time_ as date)