Левое внешнее соединение просто означает, что вы хотите вернуть всю таблицу в левой части соединения и любые совпадающие строки из таблицы справа.
В старом синтаксисе Oracle это будет: where t1.col1 = t2.col1 (+)
В синтаксисе ANSI это будет: from t1 left outer join t2 on (t1.col1 = t2.col1)
Правое внешнее соединение означает, что вы хотите вернуть всю таблицу в правой части соединения и любые совпадающие строки из таблицы в левой части.
В синтаксисе Oracle старого стиля это будет: where t2.col1 (+) = t1.col1
В синтаксисе ANSI это будет: from t2 right outer join t1 on (t2.col1 = t1.col1)
Вы, конечно, заметили, что можно превратить правое внешнее соединение в левое внешнее соединение, просто поменяв порядок таблиц на противоположный. Большинство внешних объединений являются левыми, вероятно, потому, что проще думать: «Я хочу всю эту первую таблицу и любые совпадающие строки из этой другой таблицы», а не наоборот. YMMV, конечно!
ETA следующие примеры:
Левое внешнее соединение:
with t1 as (select 1 col1, 10 col2 from dual union all
select 2 col1, 20 col2 from dual union all
select 3 col1, 30 col2 from dual),
t2 as (select 1 col1, 100 col2 from dual)
select t1.*, t2.*
from t1, t2
where t1.col1 = t2.col1 (+)
order by t1.col1;
COL1 COL2 COL1_1 COL2_1
---------- ---------- ---------- ----------
1 10 1 100
2 20
3 30
with t1 as (select 1 col1, 10 col2 from dual union all
select 2 col1, 20 col2 from dual union all
select 3 col1, 30 col2 from dual),
t2 as (select 1 col1, 100 col2 from dual)
select t1.*, t2.*
from t1 left outer join t2 on (t1.col1 = t2.col1)
order by t1.col1;
COL1 COL2 COL1_1 COL2_1
---------- ---------- ---------- ----------
1 10 1 100
2 20
3 30
Правое внешнее соединение:
with t1 as (select 1 col1, 10 col2 from dual union all
select 2 col1, 20 col2 from dual union all
select 3 col1, 30 col2 from dual),
t2 as (select 1 col1, 100 col2 from dual)
select t1.*, t2.*
from t1, t2
where t2.col1 (+) = t1.col1
order by t1.col1;
COL1 COL2 COL1_1 COL2_1
---------- ---------- ---------- ----------
1 10 1 100
2 20
3 30
with t1 as (select 1 col1, 10 col2 from dual union all
select 2 col1, 20 col2 from dual union all
select 3 col1, 30 col2 from dual),
t2 as (select 1 col1, 100 col2 from dual)
select t1.*, t2.*
from t2 right outer join t1 on (t2.col1 = t1.col1)
order by t1.col1;
COL1 COL2 COL1_1 COL2_1
---------- ---------- ---------- ----------
1 10 1 100
2 20
3 30
person
Boneist
schedule
13.02.2015
(+)
, если им не нужно поддерживать устаревший Oracle SQL. - person sampathsris   schedule 13.02.2015FAST REFRESH
, вы должны использовать старый синтаксис Oracle, иначе быстрое обновление невозможно. Сами Oracle не считают это ошибкой. Ответ на мой SR был: Это просто отсутствие документации! - person Wernfried Domscheit   schedule 13.02.2015