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
FROM
klauzuleOUTER JOIN
syntaxe 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í naFROM
klauzuleOUTER JOIN
syntaxe:
- Nemůžete zadat
(+)
operátor v bloku dotazu, který také obsahujeFROM
syntaxe spojení klauzule.(+)
operátor se může objevit pouze vWHERE
klauzule nebo v kontextu levé korelace (při specifikaciTABLE
klauzule) vFROM
klauzule 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
WHERE
podmínku obsahující(+)
operátor nelze kombinovat s jinou podmínkou pomocíOR
logický operátor.- A
WHERE
podmínka nemůže použítIN
podmínku porovnání pro porovnání sloupce označeného(+)
operátor s výrazem.Pokud
WHERE
klauzule 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. VizSELECT
pro syntaxi pro vnější spojení.