Oracle
 sql >> база данни >  >> RDS >> Oracle

Разлика между нотацията плюс (+) на Oracle и нотация на ansi JOIN?

AFAIK, (+) нотацията присъства само за обратна съвместимост, тъй като Oracle я дебютира преди въвеждането на ANSI стандарта за присъединяване. Той е специфичен за Oracle и трябва да избягвате да го използвате в нов код, когато има налична еквивалентна версия, съвместима със стандартите.

Изглежда, че има разлики между двете и (+) нотацията има ограничения, които синтаксисът на ANSI присъединяване няма. Самите Oracle препоръчват да не използвате (+) нотация. Пълното описание тук в Oracle® Database SQL Language Reference11g Release 1 (11.1):

Oracle препоръчва да използвате FROM клауза OUTER JOIN синтаксис, а не операторът за присъединяване на Oracle. Външни заявки за присъединяване, които използват оператора за присъединяване на Oracle (+) са обект на следните правила и ограничения, които не се отнасят за FROM клауза OUTER JOIN синтаксис:

  • Не можете да посочите (+) оператор в блок на заявка, който също съдържа FROM синтаксис за присъединяване на клауза.
  • (+) операторът може да се появи само в WHERE клауза или, в контекста на лява корелация (при уточняване на TABLE клауза) в FROM клауза и може да се приложи само към колона на таблица или изглед.
  • Ако A и B са свързани с множество условия за присъединяване, тогава трябва да използвате (+) оператор при всички тези условия. Ако не го направите, Oracle Database ще върне само редовете, получени в резултат на обикновено присъединяване, но без предупреждение или грешка, за да ви уведоми, че нямате резултатите от външно свързване.
  • (+) операторът не произвежда външно свързване, ако посочите една таблица във външната заявка, а другата таблица във вътрешна заявка.
  • Не можете да използвате (+) оператор за външно присъединяване на таблица към себе си, въпреки че самообединяването е валидно.

Например следното изявление не е валидно:

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;
  • (+) Операторът може да се приложи само към колона, а не към произволен израз. Въпреки това, произволен израз може да съдържа една или повече колони, маркирани с (+) оператор.
  • WHERE условие, съдържащо (+) операторът не може да се комбинира с друго условие с помощта на OR логически оператор.
  • WHERE условието не може да използва IN условие за сравнение, за да сравните колона, маркирана с (+) оператор с израз.

Ако WHERE клаузата съдържа условие, което сравнява колона от таблица B с константа, след което (+) операторът трябва да се приложи към колоната, така че Oracle да върне редовете от таблица А, за които е генерирал нулеви стойности за тази колона. В противен случай Oracle връща само резултатите от обикновеното присъединяване.

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:как да направите сигурност на ниво ред (като виртуалната частна база данни на Oracle)?

  2. Конвертирайте OracleParameter.Value в Int32

  3. Възможно ли е да се убие една заявка в oracle, без да се убива сесията?

  4. 2 начина за свързване на низ и число в Oracle

  5. Забавност на подзаявката на Oracle