sql >> Databáze >  >> RDS >> Oracle

Rozdíl mezi notací Oracle plus (+) a notací ansi JOIN?

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 klauzule OUTER 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í na FROM klauzule OUTER JOIN syntaxe:

  • Nemůžete zadat (+) operátor v bloku dotazu, který také obsahuje FROM syntaxe spojení klauzule.
  • (+) operátor se může objevit pouze v WHERE klauzule nebo v kontextu levé korelace (při specifikaci TABLE klauzule) v FROM 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žít IN 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. Viz SELECT pro syntaxi pro vnější spojení.



  1. Ověřování SQL Server vs. ověřování Windows:Které použít a kdy

  2. MySQL UPDATE a SELECT v jednom průchodu

  3. Opravit poškozenou databázi postgresql

  4. Nejlepší zdroje pro vzdělávání a školení PostgreSQL