Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема с вложенными запросами [D7, FireBird]


jiny ©   (2005-06-02 13:06:00) 

есть таблица Seria (идентификатор num_ser) и таблицы движений серий (fr1_2,fr2_2,frFil1_2,fp2_2,fp1_2,spi1_2 (идентификатор id_ser))
в сериях есть поле Goden(срок годности)
Остаток в сериях вычисляется интерактивно следующим запросом :
TmpOstTek=
COALESCE((select sum(kol) from fp1_2 where fp1_2.id_ser=s.num_ser and flag=1),0)+

COALESCE((select sum(kol) from fp2_2 where fp2_2.id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from fr1_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from fr2_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from frfil1_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from spi1_2 where id_ser=s.num_ser and flag=1),0)


вычисляется все быстро, т.к. в табл. Seria и в сопутствующих таблицах движений по сериям установлены соответствующие индексы

Запрос на показ серий, имеющихся в наличии выглядит так
'select '+TmpOstTek+',s.num_ser,s.cost_zk from seria where '+TmpIsActive+TmpP_Jrn+TmpSearchPlace,
где
TmpIsActive:='isActive=1';
TmpP_Jrn:=' and p_jrn=9'; номер внутреннего журнала - не относится к вопросу
TmpSearchPlace:=TmpOstTek>0, где TmpOstTek=вышеуказанному запросу вычисления остатков серий

Вопрос :
Возможно ли в TmpSearchPlace не указывать весь запрос целиком(TmpOstTek), а просто указать что-то вроде 'seria.1 колонка>0'
иначе запрос действует медленней и при еще более сложных критериях отбора вообще замедляется, чем показать все серии, если возможно, то как ?
Какой можете предложить выход ?


jiny   (2005-06-02 15:34:00) [1]

Спасибо, в принципе я это уже реализовал в ХП, но просто напоследок хотелось бы узнать вообще возможнен ли такой вариант в прямом запросе


Johnmen   (2005-06-02 14:05:00) [2]

Возможно.
См. в сторону view и хранимых процедур.


jiny   (2005-06-02 14:00:00) [3]

Мне нужно чтобы запрос был не таким :
select
(COALESCE((select sum(kol) from fp1_2 where fp1_2.id_ser=s.num_ser and flag=1),0)+

COALESCE((select sum(kol) from fp2_2 where fp2_2.id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from fr1_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from fr2_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from frfil1_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from spi1_2 where id_ser=s.num_ser and flag=1),0)) as ost_tek,num_ser,cost_zk from seria where
isActive=1 and p_jrn=9 and
(COALESCE((select sum(kol) from fp1_2 where fp1_2.id_ser=s.num_ser and flag=1),0)+

COALESCE((select sum(kol) from fp2_2 where fp2_2.id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from fr1_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from fr2_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from frfil1_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from spi1_2 where id_ser=s.num_ser and flag=1),0))>0


а что-то вроде этого :

select
(COALESCE((select sum(kol) from fp1_2 where fp1_2.id_ser=s.num_ser and flag=1),0)+

COALESCE((select sum(kol) from fp2_2 where fp2_2.id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from fr1_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from fr2_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from frfil1_2 where id_ser=s.num_ser and flag=1),0)-

COALESCE((select sum(kol) from spi1_2 where id_ser=s.num_ser and flag=1),0)) as ost_tek,
num_ser,cost_zk from seria where
isActive=1 and p_jrn=9 and
s.ost_tek>0


это возможно ?


Johnmen   (2005-06-02 13:27:00) [4]

Предлагаю формализовать постановку вопроса и задать его заново.


Наверх

Титульная страница Поиск, карта сайта Написать письмо