Оператор Oracle "(+)"


155

Я перевіряю деякі старі заяви SQL з метою документування їх і, ймовірно, їх вдосконалення.

СУБД є Oracle

Я не зрозумів твердження, яке читалося так:

select ...
from a,b
where a.id=b.id(+)

Я розгублений щодо (+)оператора, і не міг отримати його на жодному форумі ... (пошук + у котируваннях теж не працював).

У будь-якому випадку, я використав "Поясніть план" SQLDeveloper, і я отримав висновок про те HASH JOIN, RIGHT OUTER, що і т.д.

Чи буде якась різниця, якщо я видалю (+)оператора в кінці запиту? Чи повинна база даних задовольняти деяким умовам (наприклад, мати деякі індекси тощо), перш ніж (+)їх можна використовувати ?? Було б дуже корисно, якщо ви можете надати мені просте розуміння, або кілька хороших посилань, де я можу прочитати про це.

Дякую!


1
Це не оператор. Це просто фрагмент синтаксису, який впливає на те, що робить приєднання.
філіпсі

Відповіді:


186

Це специфічне позначення Oracle для OUTER JOIN, оскільки формат ANSI-89 (використовуючи кому в пункті FROM для розділення посилань на таблицю) не стандартизував приєднання OUTER.

Запит буде переписаний у синтаксис ANSI-92 у вигляді:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

Це посилання досить добре пояснює різницю між JOIN .


Слід також зазначити, що, хоч і (+)працює, Oracle рекомендує не використовувати його :

Oracle рекомендує використовувати синтаксис FROMпропозицій, OUTER JOINа не оператор приєднання Oracle. На зовнішні запити приєднання, що використовують оператор приєднання Oracle (+), застосовуються такі правила та обмеження, які не стосуються синтаксису FROMзастережень OUTER JOIN:


79
Точно правильно. Щоб зберегти (+) прямо в моїй голові (лівий бік проти правого боку), я люблю вважати (+) як "додавання значень NULL, якщо не знайдено відповідності". Наприклад, "a.id = b.id (+)" означає дозволити b.id бути NULL, якщо немає відповідності з a.id.
пляж

дякую .. Я здогадуюсь, додавання його в пункті повинно дати той же результат !!
Кіран S

Ви можете мати посилання на офіційну документацію Oracle: docs.oracle.com/html/A95915_01/sqopr.htm
Варган

27

Оператор (+) вказує зовнішнє з'єднання. Це означає, що Oracle все одно поверне записи з іншої сторони приєднання навіть тоді, коли немає відповідності. Наприклад, якщо a і b є працівниками та департаментами, і у вас можуть бути непризначені працівники підрозділу, наступна заява повертає реквізити всіх працівників, незалежно від того, вони були призначені у відділ чи ні.

select * from emp, dept where emp.dept_id=dept.dept_id(+)

Отже, коротше кажучи, видалення (+) може змінити значення, але ви, можливо, не помітите певний час залежно від ваших даних!


25

В Oracle (+) позначає таблицю "необов'язково" в ПРИЄДНАЙТЕСІ. Отже, у вашому запиті,

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

це ЛІВНІШЕ ВІДПРИЄМСТВО таблиці "b" до таблиці "a". Він поверне всі дані таблиці 'a', не втрачаючи своїх даних, коли інша сторона (опціональна таблиця 'b') не має даних.

Діаграма лівого зовнішнього з'єднання

Сучасний стандартний синтаксис для того ж запиту був би

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

або зі скороченням a.id=b.id(не підтримується всіма базами даних):

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

Якщо ви видалите (+), це буде нормальним внутрішнім запитом приєднання

Старіший синтаксис як у Oracle, так і в інших базах даних:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

Більш сучасний синтаксис:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

Або просто:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

Діаграма внутрішньої приєднання

Він поверне всі дані лише тоді, коли значення 'id' та 'b' таблиці 'id' однакове, означає загальну частину.

Якщо ви хочете зробити свій запит правильним приєднанням

Це точно так само, як LEFT JOIN, але перемикає таблицю необов'язково.

Діаграма правильного зовнішнього приєднання

Старий синтаксис Oracle:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

Сучасний стандартний синтаксис:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

Довідка та допомога:

https://asktom.oracle.com/pls/asktom/f?p=100:11::::::P11_QUESTION_ID:6585774577187

Залишилося Зовнішнє приєднання, використовуючи + увійти в Oracle 11г

https://www.w3schools.com/sql/sql_join_left.asp


Мітки кола "table1" & "table2" - це нісенітниця. Найпростіше значення елементів кола - це вихідні рядки. Тоді лівий півмісяць містить нульові розширені рядки table1, а правий півмісяць містить нульові розширені рядки table2. Інші значення для кіл незрозумілі. Що саме, на вашу думку, означають діаграми? Чому ви розміщували їх, окрім як сліпо копіювати чужі (погані) презентації?
філіпсі

Зараз ви позначили кола a & b. Кола не є рядками & b. Ліві та праві кола можуть бути обґрунтовано позначені рядками лівого з'єднання b & правого з'єднання b. Більше того, ви не описуєте, якими є ці обведені рядки з точки зору введення. Робіть для себе, які речі є у колах. Якщо ви збираєтеся наклеїти на кола кружечки a & b, поясніть словами, що стосується кожної мітки зі своїм колом. (Немає прямої причини, щоб позначити їх & b.) Добре, що ви правильно позначили зелені зони.
philipxy

6

На практиці символ + розміщується безпосередньо в умовному викладі та збоку від додаткової таблиці (тієї, якій дозволено містити порожні або нульові значення в умовних умовах).


(+) Ставиться відразу праворуч від імені стовпця. Ця відповідь не зрозуміла з цього приводу. Що має означати "на практиці"? (Риторичне.) (І ви, мабуть, не маєте на увазі "твердження".)
philipxy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.