Я пытаюсь создать запрос, в котором, в зависимости от переменной, включенные результаты являются результатом одного из трех условий:
1) WHERE am.process IN (SELECT process_name FROM it.special_processes)
2) WHERE am.process NOT IN (SELECT process_name FROM it.special_processes)
3) (equivalent of no WHERE clause for the process)
Этот запрос работает для условия 1:
SELECT info.sortingorder sort, info.stage, SUM(am.qty) boh
FROM it.snpshot am, it.info info, it.naming nm
WHERE info.stage = nm.stage(+)
AND am.process IN (SELECT process_name FROM it.special_processes)
GROUP BY info.sortingorder, info.stage
Это работает для условия 1 или, в зависимости от: флага, условия 3:
SELECT info.sortingorder sort, info.stage, SUM(am.qty) boh
FROM it.snpshot am, it.info info, it.naming nm
WHERE info.stage = nm.stage(+)
AND :FLAG = 1 OR am.process IN (SELECT process_name FROM it.special_processes)
GROUP BY info.sortingorder, info.stage
Однако, когда я хочу обработать условие 3, все усложняется.Я пытался что-то вроде:
SELECT info.sortingorder sort, info.stage, SUM(am.qty) boh
FROM it.snpshot am, it.info info, it.naming nm
WHERE info.stage = nm.stage(+)
AND :flag = 0 -- (this is for condition 3)
OR (:flag = 1 AND am.process IN (SELECT process_name FROM it.special_processes))
OR (:flag = 2 AND am.process NOT IN (SELECT process_name FROM it.special_processes))
GROUP BY info.sortingorder, info.stage
... Но я получаю:
ORA-01719: outer join operator (+) not allowed in operand of OR or IN
*Cause: An outer join appears in an or clause.
*Action: If A and B are predicates, to get the effect of (A(+) or B),
try (SELECT WHERE (A(+) AND NOT B)) UNION ALL (SELECT WHERE (B)).
Error at Line: 5 Column: 19
Сообщение об ошибке пытается дать какой-то совет, но я не вижу, как оно относится кнабор условий, как показано выше (условное UNION ALL).Удаление внешнего соединения (+) устраняет ошибку, но она есть по причине.Сложность начинает возрастать (особенно учитывая, что вышеизложенное является результатом гораздо более крупного запроса), и у меня уже есть SQL «NOT IN ()», который я обычно вижу в виде красного флага.Мой предыдущий подход состоял в том, чтобы динамически генерировать «NOT IN» или «IN» часть строки запроса, но это всегда выглядело как ужасный хак.Примечание: PL / SQL не подходит по разным причинам.
Мой вопрос: как бы вы справились с этой ситуацией?