Левое внешнее соединение с помощью + вход в 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 75

4 ответа:

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

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

в терминологии справа или слева укажите, какая сторона соединения всегда имеет запись, а другая сторона может быть нулевой. Так что в 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 ( + ) подчиняется следующим правилам и ограничения, которые не применяются к предложению FROM OUTER JOIN синтаксис:

  • вы не можете указать оператор (+) в блоке запроса, который также содержит предложение 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 и С. обратитесь к выберите для синтаксис внешнего соединения.

взято из 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 Exam Guide. В таблице 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

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