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