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
за синтаксиса за външно съединение.