Помогите избавиться от подзапроса. Oracle - PL/SQL хранимые процедуры

программирование проблема базы данных sql oracle

Есть запрос:

SELECT sum(bv.value)
FROM fin.budget_value bv,
fin.budget_factor bf,
fin.budget_directory bd
where bd.id = bf.budget_directory_id
AND bf.ID = bv.budget_factor_id
AND bd.budget_groups_id = 7 -- NR/OF
AND bv.budget_groups_id = 7 -- NR/OF
AND bv.budget_flag_correction_id = 81
AND (bv.division_id = 0 OR 0 = 0)
AND bv.periods_id in (SELECT id FROM fin.periods
WHERE type_period = 'M'
AND to_date(date_from,'dd.mm.yy') BETWEEN
trunc(to_date('01.01.2012','dd.mm.yy'),'mm') AND trunc(to_date('15.10.2012','dd.mm.yy'),'mm'))
AND (bd.ID = 535 or (bd.ID in (SELECT bd.ID
FROM fin.budget_directory bd,
fin.finres_factor_plan ffp,
fin.finres_directory fd,
fin.nakl_directory nd
WHERE nd.code = fd.code
AND fd.ID = ffp.finres_directory_id
AND ffp.plan_namepp = bd.code
AND (ffp.budget_business_id = 0 OR (ffp.budget_business_id = 9 AND 0 = 0))
AND nd.ID = 109) AND 7 = 7))
and (bf.budget_business_id = 0 or 0 = 0);


Нужно избавиться от подзапроса: or (bd.ID in (SELECT bd.ID
FROM fin.budget_directory bd,
fin.finres_factor_plan ffp,
fin.finres_directory fd,
fin.nakl_directory nd
WHERE nd.code = fd.code
AND fd.ID = ffp.finres_directory_id
AND ffp.plan_namepp = bd.code
AND (ffp.budget_business_id = 0 OR (ffp.budget_business_id = 9 AND 0 = 0))
AND nd.ID = 109) AND 7 = 7))

это PL/SQL в хранимой процедуре.
Ответы:
Вам не кажется что условия  (bv.division_id = 0 OR 0 = 0) и (bf.budget_business_id = 0 or 0 = 0) выполняются всегда?
И расскажите, отчего вам понадобилось избавиться от этого подзапроса? что с ним не так?
-----------------------------------------------------------------
как вариант(не избавился конечно, потому как не вкурсе, нужен он вам или нет):
SELECT sum(bv.value)
FROM  fin.budget_value bv,
      fin.budget_factor bf,
      fin.budget_directory bd
where bd.id = bf.budget_directory_id
  AND bf.ID = bv.budget_factor_id
  AND bd.budget_groups_id = 7 -- NR/OF
  AND bv.budget_groups_id = 7 -- NR/OF
  AND bv.budget_flag_correction_id = 81
  AND bv.division_id = 0
  AND bv.periods_id in (SELECT id
                          FROM fin.periods
                         WHERE type_period = 'M'
                           AND to_date(date_from,'dd.mm.yy') BETWEEN
                                         trunc(to_date('01.01.2012','dd.mm.yy'),'mm') AND trunc(to_date('15.10.2012','dd.mm.yy'),'mm'))
  AND  bd.ID in (SELECT 535 FROM DUAL
                 UNION
                 SELECT bd.ID
                   FROM fin.budget_directory bd,
                        fin.finres_factor_plan ffp,
                        fin.finres_directory fd,
                        fin.nakl_directory nd
                   WHERE nd.code = fd.code
                     AND fd.ID = ffp.finres_directory_id
                     AND ffp.plan_namepp = bd.code
                     AND ffp.budget_business_id in(0,9)
                     AND nd.ID = 109)
  and (bf.budget_business_id = 0);
-----------------------------
и если он вам так не нравится, почему бы не выполнить его заранее, а в этот запрос не подставить только список значений из этого запроса?


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.