Левое внешнее соединение с помощью + вход в Oracle 11g

может ли кто-нибудь сказать мне, являются ли ниже 2 запросов примером левого внешнего соединения или правого внешнего соединения??

Table Part:
Name         Null?       Type
PART_ID      NOT NULL    VARCHAR2(4)
SUPPLIER_ID              VARCHAR2(4)

PART_ID SUPPLIER_ID
P1      S1
P2      S2
P3  
P4  

Table Supplier:
Name            Null?     Type
SUPPLIER_ID NOT NULL      VARCHAR2(4)
SUPPLIER_NAME   NOT NULL  VARCHAR2(20)

SUPPLIER_ID  SUPPLIER_NAME
S1           Supplier#1
S2           Supplier#2
S3           Supplier#3

покажите все части независимо от Ли любой поставщик поставляет их или не:

SELECT P.Part_Id, S.Supplier_Name
FROM Part P, Supplier S
WHERE P.Supplier_Id = S.Supplier_Id (+)

SELECT P.Part_Id, S.Supplier_Name
FROM Part P, Supplier S
WHERE S.Supplier_Id (+) = P.Supplier_Id

спасибо!

4 ответов


TableA LEFT OUTER JOIN TableB эквивалентно TableB RIGHT OUTER JOIN Table A.

В Oracle, (+) обозначает "необязательную" таблицу в соединении. Итак, в вашем первом запросе это P LEFT OUTER JOIN S. Во втором запросе это S RIGHT OUTER JOIN P. они функционально эквивалентны.

в терминологии, справа или слева укажите, какая сторона соединения всегда имеет запись, а другая сторона может быть null. Так что в P LEFT OUTER JOIN S, P всегда будет иметь запись, потому что она находится на LEFT, а S может быть null.

посмотреть этот пример из java2s.com для дополнительного объяснения.


чтобы уточнить, я думаю, я говорю, что терминология не имеет значения, так как она только помогает визуализировать. Важно то, что вы понимаете концепцию того, как это работает.


правый против левого

я видел некоторую путаницу в том, что имеет значение при определении правого против левого в неявном синтаксисе соединения.

СЛЕВА СНАРУЖИ Присоединяйтесь

SELECT *
FROM A, B
WHERE A.column = B.column(+)

ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

SELECT *
FROM A, B
WHERE B.column(+) = A.column

все, что я сделал, это поменять стороны терминов в предложении WHERE, но они все еще функционально эквивалентны. (См. выше в моем ответе для получения дополнительной информации об этом.) Размещение (+) определяет вправо или влево. (В частности, если (+) находится справа, это левое соединение. Если (+) находится слева, это правое соединение.)


типы соединения

два стиля соединения неявные связи и явные объединения. Это разные стили письма, но они функционально эквивалентны.

посмотреть это так вопрос.

Неявные Связи просто перечислите все таблицы вместе. Условия соединения указываются в предложении WHERE.

неявное соединение

SELECT *
FROM A, B
WHERE A.column = B.column(+)

Явные Объединения связать условия соединения с a включение конкретной таблицы вместо предложения WHERE.

явное присоединение

SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column

эти Неявные соединения могут быть более трудными для чтения и понимания, и они также имеют несколько ограничений, поскольку условия соединения смешиваются в других условиях WHERE. Таким образом, неявные соединения обычно рекомендуются в пользу явного синтаксиса.


эти два запроса выполнение OUTER JOIN. Смотрите ниже

Oracle рекомендует использовать синтаксис внешнего соединения предложения FROM вместо оператора Oracle join. Внешние запросы соединения, использующие Оператор Oracle join ( + ) подчиняется следующим правилам и ограничения, которые не применяются к внешнему присоединению предложения FROM синтаксис:

  • вы не можете указать оператор (+) в блоке запроса, который также содержит предложение FROM синтаксис соединения.

  • оператор (+) может отображаться только в предложении WHERE или в контекст левой корреляции( при указании предложения TABLE) в Предложение FROM, и может применяться только к столбцу таблицы или представления.

  • Если A и B соединены несколькими условиями соединения, то вы должны использовать оператор (+) во всех этих условиях. Если нет, то База данных Oracle будет возвращать только строки, полученные из простого присоединяюсь, но без предупреждения или ошибки, чтобы сообщить вам, что вы не результаты внешнего соединения.

  • оператор (+) не создает внешнее соединение, если вы укажете одно таблица во внешнем запросе и другая таблица во внутреннем запросе.

  • вы не можете использовать оператор (+) для внешнего присоединения таблицы к себе, хотя самостоятельные соединения действительны. Например, следующее утверждение недопустимо:

    -- The following statement is not valid:
    SELECT employee_id, manager_id
       FROM employees
       WHERE employees.manager_id(+) = employees.employee_id;
    

    однако допустимо следующее самостоятельное соединение:

    SELECT e1.employee_id, e1.manager_id, e2.employee_id
       FROM employees e1, employees e2
       WHERE e1.manager_id(+) = e2.employee_id
       ORDER BY e1.employee_id, e1.manager_id, e2.employee_id;
    
  • оператор (+) может применяться только к столбцу, а не к произвольному выражение. Однако произвольное выражение может содержать одно или дополнительные столбцы, отмеченные оператором ( + ).

  • a, где условие, содержащее оператор ( + ), не может быть объединено с другое условие с использованием логического оператора OR.

  • условие WHERE нельзя использовать в условии сравнения сравнить столбец, помеченный оператором ( + ) с выражением.

Если предложение WHERE содержит условие, сравнивающее столбец из таблица B с константой, то оператор ( + ) должен быть применен к столбец, так что Oracle возвращает строки из таблицы A, для которой он имеет генерируемые значения NULL для этого столбца. В противном случае Oracle возвращает только результаты простого соединения.

в запросе, что выполняет внешние соединения более чем двух пар таблиц, одна таблица может быть пустой таблицы, созданные только для одной другой таблица. По этой причине нельзя применить оператор (+) к столбцам B в условии соединения для A и B и условие соединения для B и C. см. SELECT для синтаксиса внешнего соединения.

взято из http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm


Я видел некоторые противоречия в ответах выше, я просто попробовал следующее На Oracle 12c, и следующее правильно:

ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

SELECT *
FROM A, B
WHERE A.column = B.column(+)

ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

SELECT *
FROM A, B
WHERE B.column(+) = A.column

в этом потоке есть неправильная информация. Я скопировал и вставил неверную информацию:

ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

SELECT *
FROM A, B
WHERE A.column = B.column(+)

ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

SELECT *
FROM A, B
WHERE B.column(+) = A.column

вышеизложенное неверно!!!!! Все наоборот. Как я определил, что это неправильно, из следующей книги:

Oracle OCP введение в Oracle 9i: руководство по экзамену SQL. Страница 115 таблица 3-1 имеет хорошее резюме на этом. Я не мог понять, почему мой преобразованный SQL не работал должным образом, пока я не пошел в старую школу и не посмотрел в печатную книгу!

вот резюме из этой книги, скопированное строка за строкой:

синтаксис внешнего соединения Oracle:

from tab_a a, tab_b b,                                       
where a.col_1 + = b.col_1                                     

эквивалент ANSI/ISO:

from tab_a a left outer join  
tab_b b on a.col_1 = b.col_1

обратите внимание, что это обратная сторона того, что опубликовано выше. Я полагаю, что в этой книге могут быть ошибки, однако я доверяю этой книге больше, чем тому, что находится в этой теме. Это руководство по экзамену для крика вслух...