Здравствуйте! В запросе нужно отобрать все проводки от даты последнего нуля на счете (acc_accounts.amount = 0) или от даты открытия счета (ra.acc_open_date), если нулевых остатков вообще не было, и до отчетной даты (p_end_date). В подзапросе получаем дату последнего нуля или, если не было таких остатков дату - '01.01.1700', которая нужна только лишь для определения того, с какой датой сравнивать дату проводки (с датой открытия или с датой последнего нуля на счете).
SELECT act.trns_code, act.trns_db, act.trns_ref_acc_db_id, ra.acc_currency, ra.acc_branch
FROM acc_transactions act, (SELECT ref_acc_id, MAX(DECODE(amount,0,as_of_date,to_date('01.01.1700','DD.MM.YYYY'))) max_date
FROM acc_accounts
WHERE as_of_date < :p_end_date
GROUP BY ref_acc_id) acc, ref_accounts ra
WHERE act.trns_ref_acc_db_id = acc.ref_acc_id
AND ra.ref_acc_id = act.trns_ref_acc_db_id
AND ra.acc_no LIKE '603%'
AND ra.acc_type_ap LIKE 'A'
AND act.as_of_date >= DECODE(acc.max_date,to_date('01.01.1700','DD.MM.YYYY'),ra.acc_open_date,acc.max_date)
AND act.as_of_date < :p_end_date
AND act.trns_ref_acc_db_id = 65105488 По одному счету время выполнения приемлимое, стоимость запроса 539. Необходимо этим запросом обработать все счета '603', то есть последнее условие на id счета нужно убрать. Запрос в результате чего работает очень долго. Подскажите, пожалуйста, как можно его ускорить. Буду рада любому дельному совету. |