AFAIK, (+) zápis je přítomen pouze pro zpětnou kompatibilitu, protože Oracle jej debutoval před zavedením standardu ANSI pro spojení. Je specifický pro Oracle a neměli byste ho používat v novém kódu, pokud je k dispozici ekvivalentní verze vyhovující standardům.
Zdá se, že mezi těmito dvěma a (+) jsou rozdíly zápis má omezení, která syntaxe spojení ANSI nemá. Sám Oracle doporučuje, abyste nepoužívali (+) notace.Úplný popis zde v Oracle® Database SQL Language Reference11g Release 1 (11.1):
Oracle doporučuje použít
FROMklauzuleOUTER JOINsyntaxe spíše než operátor spojení Oracle. Dotazy na vnější spojení, které používají operátor spojení Oracle(+)podléhají následujícím pravidlům a omezením, která se nevztahují naFROMklauzuleOUTER JOINsyntaxe:
- Nemůžete zadat
(+)operátor v bloku dotazu, který také obsahujeFROMsyntaxe spojení klauzule.(+)operátor se může objevit pouze vWHEREklauzule nebo v kontextu levé korelace (při specifikaciTABLEklauzule) vFROMklauzule a lze jej použít pouze na sloupec tabulky nebo pohledu.- Pokud jsou A a B spojeny několika podmínkami spojení, musíte použít
(+)operátora za všech těchto podmínek. Pokud tak neučiníte, Oracle Database vrátí pouze řádky vyplývající z jednoduchého spojení, ale bez varování nebo chyby, které by vás upozornily, že nemáte výsledky vnějšího spojení.(+)Pokud zadáte jednu tabulku ve vnějším dotazu a druhou tabulku ve vnitřním dotazu, operátor nevytváří vnější spojení.- Nemůžete použít
(+)operátor k vnějšímu spojení tabulky k sobě samému, i když vlastní spojení jsou platná.Například následující prohlášení není platné:
SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id;Platí však následující vlastní připojení:
SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id;
(+)operátor lze použít pouze na sloupec, nikoli na libovolný výraz. Libovolný výraz však může obsahovat jeden nebo více sloupců označených(+)operátor.- A
WHEREpodmínku obsahující(+)operátor nelze kombinovat s jinou podmínkou pomocíORlogický operátor.- A
WHEREpodmínka nemůže použítINpodmínku porovnání pro porovnání sloupce označeného(+)operátor s výrazem.Pokud
WHEREklauzule obsahuje podmínku, která porovnává sloupec z tabulky B s konstantou, pak(+)operátor musí být aplikován na sloupec, aby Oracle vrátil řádky z tabulky A, pro které vygeneroval hodnoty null pro tento sloupec. Jinak Oracle vrátí pouze výsledky jednoduchého spojení.V dotazu, který provádí vnější spojení více než dvou párů tabulek, může být jedna tabulka tabulkou vygenerovanou hodnotou null pouze pro jednu další tabulku. Z tohoto důvodu nemůžete použít
(+)operátor na sloupce B v podmínce spojení pro A a B a podmínce spojení pro B a C. VizSELECTpro syntaxi pro vnější spojení.