Текущий архив: 2005.07.18;
Скачать: CL | DM;
Внизпроблема с вложенными запросами Найти похожие ветки
← →
jiny (2005-06-02 13:06) [0]есть таблица 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"
иначе запрос действует медленней и при еще более сложных критериях отбора вообще замедляется, чем показать все серии, если возможно, то как ?
Какой можете предложить выход ?
← →
Johnmen © (2005-06-02 13:27) [1]Предлагаю формализовать постановку вопроса и задать его заново.
← →
jiny (2005-06-02 14:00) [2]Мне нужно чтобы запрос был не таким :
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 14:05) [3]Возможно.
См. в сторону view и хранимых процедур.
← →
jiny (2005-06-02 15:34) [4]Спасибо, в принципе я это уже реализовал в ХП, но просто напоследок хотелось бы узнать вообще возможнен ли такой вариант в прямом запросе
Страницы: 1 вся ветка
Текущий архив: 2005.07.18;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.036 c