2017-05-11 83 views
6

Właśnie się dowiedziałem, że Oracle 12c obsługuje korelację zapytania o kilka poziomów głębokości, co nie jest obsługiwane w wersjach 11g i wcześniejszych.Dokumentacja Oracle 12c dotycząca zmian/nowych funkcji dla SQL

select 
    * 
from 
    tab1 a 
where 
    not exists 
     (select 
       * 
      from 
       (select 
        * 
       from 
        tab2 b 
       where a.X = b.X)) 

Ale nie mogłem znaleźć tego udokumentowanego na stronie Oracle. Czy są inne ukryte funkcje SQL dodane do Oracle 12c? Czy wszystkie takie zmiany w SQL 12c są gdzieś udokumentowane?

+2

Każde wydanie zawiera "Przewodnik po nowych funkcjach": http://docs.oracle.com/database/121/NEWFT/toc.htm Nie mogę jednak znaleźć żadnego odniesienia pasującego do tej zmiany. –

+0

@a_horse_with_no_name Tak, sprawdziłem te dokumenty również przed wysłaniem. Mam wrażenie, że jest to przypadek pominiętej dokumentacji firmy Oracle (tak ważnej funkcji, która zmienia SQL!). – toddlermenot

+3

Nie chciałbym polegać na tej funkcji, gdybym był tobą; prawdopodobnie nie jest to zamierzone zachowanie (np. błąd). – Boneist

Odpowiedz

0

Aby to wyjaśnić, musimy trochę zanurzyć się w historii.

Możliwość wykorzystania skorelowane sub-zapytań z więcej niż 1 poziomie także w danych 10g R1 i był odpowiednio udokumentowane (https://docs.oracle.com/cd/B14117_01/server.101/b10759/queries007.htm) z powrotem tych dniach ...

Oracle wykonuje skorelowanej podkwerenda gdy zagnieżdżone podzapytanie odwołuje się do kolumny z tabeli odnoszącej się do nadrzędnej instrukcji dowolnej liczby liczby poziomów nad podzapytaniem.

... ale nie działała prawidłowo. :)

Zaczynając od Oracle 10g R2, ta funkcja została wyłączona, a dokumentacja uległa zmianie.

także (jeśli masz dostęp) widać Bug 15990897: frazę skorelowane zmienna użyta w 2 LEVEL podzapytanie nie powiedzie się z ORA-904 na Metalink (poprawione w wersji Produktu 12.1.0.1.0). Nie jestem pewien, dlaczego jest uważany za błąd, ponieważ działa zgodnie z dokumentacją (10g R2, 11g R1, 11g R2), ale tak właśnie jest.

więc funkcjonalność została wyłączona po 10,1 i przed 12.1 ale dokumentacją nawet do 12,2 (https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Using-Subqueries.html) mówi

Oracle wykonuje podzapytanie skorelowane gdy zagnieżdżone podzapytanie odniesienia kolumna z tabeli, o której mowa w oświadczeniu dominującej jeden poziom nad podzapytaniem.

wyciąć długie opowiadanie, ta funkcja jest włączona w 12c i 12c R1 R2, ale dokumentacja nie jest stała i najwyraźniej nie wspominając już o tym poprawa nowych funkcji przewodnika.

PS. O ile pamiętam standardowy SQL 2003 pozwala na korelację tylko do jednego poziomu głębokości - każdy może sprawdzić (http://www.wiscorp.com/sql_2003_standard.zip). Jednak Oracle ma wiele ulepszeń ponad standard.