2012-05-08 70 views
13

Zamiast używać słów kluczowych, takich jak FULL OUTER JOIN lub FULL JOIN, w jaki sposób mogę wykonać pełne sprzężenie zewnętrzne za pomocą klauzuli "where" za pomocą operatora "+" ?!Jak wykonać FULL OUTER JOIN w ORACLE za pomocą operatora "+"?

+4

Trzeba by UNII razem wyniki 2 zewnętrzne przyłączyć kwerend (po jednym dla A -> B, a drugi do B -> A) –

+2

dlaczego byś chcieć? Używaj jawnych połączeń, jest to preferowana metoda. Implicit dołącza obszar Antypattern języka SQL. – HLGEM

+3

Dlaczego chcesz to zrobić? Po prostu użyj składni 'FULL OUTER JOIN' (używając wyraźnego łączenia w stylu ANSI przez implicite join jest i tak wysoce zalecany) –

Odpowiedz

19

Nie możesz (przynajmniej bezpośrednio). Oracle obsługuje tylko pełne sprzężenie zewnętrzne za pomocą składni SQL: 1999.

Można udawać przez unioning dwie zewnętrzne przyłącza:

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 

To dużo bardziej czytelne przy użyciu SQL: 1999 składnia:

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

dzięki Allan ... – Munna89

3

Oto przykład można uruchomić w Oracle aby zobaczyć wyniki również dla ciebie.

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 

jest taka sama jak:

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 
Powiązane problemy