Левое внешнее соединение с помощью + вход в 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
. они функционально эквивалентны.в терминологии справа или слева укажите, какая сторона соединения всегда имеет запись, а другая сторона может быть нулевой. Так что в
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
обратите внимание, что это обратная сторона того, что опубликовано выше. Я полагаю, что в этой книге могут быть ошибки, однако я доверяю этой книге больше, чем тому, что находится в этой теме. Это руководство по экзамену для громкого крика...