Безотносительно к правильности всей задачи правки спецификации.
Почему медленно
1) в where по smdoc* smspec* всегда используйте doctype, будет не только быстрее, но и ПРАВИЛЬНЕЕ
2) выборку ндс и вычисления можно вынести в select
Код:
select t.ITEMPRICE*T.MULTIPLIER ITEMPRICE_NOTAX, t.ITEMPRICECUR*T.MULTIPLIER ITEMPRICECUR_NOTAX,
t.TOTALPRICE*T.MULTIPLIER TOTALPRICE_NOTAX, t.TOTALPRICECUR*T.MULTIPLIER TOTALPRICECUR_NOTAX,
t.awaittotalprice*T.MULTIPLIER awaittotalprice_NOTAX, t.awaittotalpricecur*T.MULTIPLIER awaittotalpricecur_NOTAX
from(
select S.ITEMPRICE, S.ITEMPRICECUR,
S.TOTALPRICE, S.TOTALPRICECUR,
sr.awaittotalprice, sr.awaittotalpricecur,
(select (1-TR.MULTIPLIER)
from supermag.smcardtax tc, supermag.smtaxrate tr, supermag.smtaxgroup tg
where tg.taxid = tr.taxid AND tg.rateid = tr.rateid AND tg.taxgroupid = tc.taxgroupid
AND d.createdat BETWEEN tc.datefrom AND tc.dateto
AND tc.article = s.article
) MULTIPLIER
from supermag.smdocuments d, supermag.smspec s, supermag.smspecrl sr
where d.doctype='RL' and d.id=:DOC_ID
and s.doctype=d.doctype and s.docid=d.id
and s.doctype=sr.doctype and s.docid=sr.docid and S.SPECITEM=SR.SPECITEM
) t
;
могут понадобиться доп. условия на smcardtax, если если существуют несколько видов налогов или регионов.
Ну и такой select пригоден для прямого update
Код:
update(
select t.ITEMPRICE, t.ITEMPRICECUR,
t.TOTALPRICE, t.TOTALPRICECUR,
t.MULTIPLIER
from(
select S.ITEMPRICE, S.ITEMPRICECUR,
S.TOTALPRICE, S.TOTALPRICECUR,
sr.awaittotalprice, sr.awaittotalpricecur,
(select (1-TR.MULTIPLIER)
from supermag.smcardtax tc, supermag.smtaxrate tr, supermag.smtaxgroup tg
where tg.taxid = tr.taxid AND tg.rateid = tr.rateid AND tg.taxgroupid = tc.taxgroupid
AND d.createdat BETWEEN tc.datefrom AND tc.dateto
AND tc.article = s.article
) MULTIPLIER
from supermag.smdocuments d, supermag.smspec s, supermag.smspecrl sr
where d.doctype='RL' and d.id=:DOC_ID
and s.doctype=d.doctype and s.docid=d.id
and s.doctype=sr.doctype and s.docid=sr.docid and S.SPECITEM=SR.SPECITEM
) t
) tt
set tt.ITEMPRICE=tt.ITEMPRICE*tt.MULTIPLIER,
tt.ITEMPRICECUR=tt.ITEMPRICECUR*tt.MULTIPLIER,
tt.TOTALPRICE=tt.TOTALPRICE*tt.MULTIPLIER,
tt.TOTALPRICECUR=tt.TOTALPRICECUR*tt.MULTIPLIER
;
update(
select t.awaittotalprice, t.awaittotalpricecur,
t.MULTIPLIER
from(
select S.ITEMPRICE, S.ITEMPRICECUR,
S.TOTALPRICE, S.TOTALPRICECUR,
sr.awaittotalprice, sr.awaittotalpricecur,
(select (1-TR.MULTIPLIER)
from supermag.smcardtax tc, supermag.smtaxrate tr, supermag.smtaxgroup tg
where tg.taxid = tr.taxid AND tg.rateid = tr.rateid AND tg.taxgroupid = tc.taxgroupid
AND d.createdat BETWEEN tc.datefrom AND tc.dateto
AND tc.article = s.article
) MULTIPLIER
from supermag.smdocuments d, supermag.smspec s, supermag.smspecrl sr
where d.doctype='RL' and d.id=:DOC_ID
and s.doctype=d.doctype and s.docid=d.id
and s.doctype=sr.doctype and s.docid=sr.docid and S.SPECITEM=SR.SPECITEM
) t
) tt
set tt.awaittotalprice=tt.awaittotalprice*tt.MULTIPLIER,
tt.awaittotalpricecur=tt.awaittotalpricecur*tt.MULTIPLIER
;