Я испытал это с Oracle 9.2. Можно обойти это, разбив FULL OUTER JOIN
на левое внешнее соединение и правое анти-соединение (или что-то в этом роде?).
SELECT a.*, b.*
from tableA a
left outer join tableB b on (a.a = b.a)
union all
SELECT a.*, b.*
from tableA a
right outer join tableB b on (a.a = b.a)
where a.a is null
Это в значительной степени указанный вами запрос, но с использованием UNION ALL
и удалением дубликатов из второй части запроса, а не с использованием UNION
. Иногда я даже не мог получить производительность из-за этого, и мне нужно было еще больше разбить запрос, но я не мог вспомнить, что это включало.
Мне показалось, что ситуация улучшилась с Oracle 10, но FULL OUTER JOIN
не то, что мне нужно очень часто, так что я не возвращался, чтобы сравнять его в последнее время.