![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с вложенными запросами [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]Предлагаю формализовать постановку вопроса и задать его заново.