2012-05-08 4 views
13

Вместо того, чтобы использовать ключевые слова, такие как FULL OUTER JOIN или FULL JOIN, как я могу выполнить полное внешнее соединение, используя предложение «where» с помощью оператора «+» ?!Как выполнить FULL OUTER JOIN в ORACLE с помощью оператора «+»?

+4

Вы должны UNION вместе результаты 2 внешнего соединения запросов (один для A -> B и один для B -> A) –

+2

почему бы вам хотеть? Используйте явные объединения, это предпочтительный метод. Неявная область присоединения SQL antipattern. – HLGEM

+3

Зачем вам это нужно? Просто используйте синтаксис «FULL OUTER JOIN» (с использованием явного объединения стилей ANSI над соединениями implict настоятельно рекомендуется в любом случае) –

ответ

19

Вы не можете (по крайней мере, напрямую). Oracle поддерживает только полное внешнее соединение с использованием синтаксиса SQL: 1999.

Вы можете подделать его на unioning два внешних соединений:

select a.field1, b.field2 
from table_a a, table_b b 
where a.id = b.id(+) 
union all 
select a.field1, b.field2 
from table_a a, table b b 
where a.id(+) = b.id 
     and a.id is null 

Это гораздо более удобным для чтения с помощью SQL: 1999 Синтаксис:

select a.field1, b.field2 
from table_a a full outer join table_b b 
on a.id = b.id 
+0

благодарит Allan ... – Munna89

3

Вот пример, который вы можете запустить в оракула, чтобы увидеть результаты для вас самих.

with 
a as 
    (select 'A' tbl, level id from dual connect by level < 1000), 
b as 
    (select 'B' tbl, level + 500 id from dual connect by level < 1000) 
select a.tbl, a.id, b.tbl, b.id from a, b where a.id = b.id(+) 
union all 
select a.tbl, a.id, b.tbl, b.id from a, b where a.id(+) = b.id and a.id is null 

То же самое, как:

with 
a as 
    (select 'A' tbl, level id from dual connect by level < 1000), 
b as 
    (select 'B' tbl, level + 500 id from dual connect by level < 1000) 
select a.tbl, a.id, b.tbl, b.id from a full outer join b on a.id = b.id 
Смежные вопросы