Korrelasjonsunderforespørsler i Invantive UniversalSQL

En underforespørsel kan nå bruke en kolonne fra forespørselen rundt den.

Dette gir en vanlig måte å beskrive “raden som hører til denne raden” på i Invantive UniversalSQL, som i eksempelet nedenfor. Til nå ga en slik underforespørsel meldingen om at kolonnen var ukjent.

Funksjonalitet

En underforespørsel søker først etter et navn i sine egne datakilder. Først når det ikke finnes der, ser den på forespørselen rundt, og deretter på den forespørselen som omgir den igjen. Et navn som finnes begge steder refererer altså til den nærmeste. Å legge til en kolonne i en tabell kan derfor ikke endre betydningen av en eksisterende underforespørsel.

En korrelasjon kan strekkes ut over et vilkårlig antall nivåer ut og kan hoppe over et nivå. En underforespørsel som ligger to nivåer dypt kan bruke en kolonne fra den ytre forespørselen uten at forespørselen imellom har noen rolle.

Korrelasjon er tillatt i de samme formene som en underforespørsel uten korrelasjon: exists og not exists, in og not in, samt den skalar underforespørselen. Den siste gir én verdi og kan være hvor som helst hvor et uttrykk er tillatt, inkludert i utvalgslisten, i en beregning og i en case.

Eksempel: Finnes det en Korresponderende Rad

Følgende eksempel velger de ansatte hvis avdeling finnes i den andre datasamlingen. Underforespørselen bruker emp.dept, en kolonne fra forespørselen rundt:

select emp.code
from   ( select 'A100' code, 'SLS' dept
         union all
         select 'A200' code, 'ENG' dept
       ) emp
where  exists ( select 1
                from   ( select 'SLS' dept
                       ) dpt
                where  dpt.dept = emp.dept
              )

Dette gir én rad med verdien A100. Ansatt A200 jobber på en avdeling som den andre samlingen ikke kjenner til.

Eksempel: En Verdi Per Rad

En skalar underforespørsel i utvalgslisten teller radene som hører til hver ansatt:

select emp.code
,      ( select count(*)
         from   ( select 'A100' code
                  union all
                  select 'A100' code
                ) ord
         where  ord.code = emp.code
       ) orders
from   ( select 'A100' code
         union all
         select 'A200' code
       ) emp

Dette resulterer i A100 med 2 og A200 med 0. En count over ingen korresponderende rader er null. Enhver annen aggregering, som max eller sum, gir i den situasjonen den tomme verdien.

Tomme Verdier

En sammenligning med den tomme verdien har ingen utfall, og utfallet varierer avhengig av formen. Ved exists vil en rad som sammenlignes med den tomme verdien ikke treffes, slik at underforespørselen ikke finner noe. Ved not in vil en tom verdi blant de oppgitte verdiene gjøre svaret ubestemt, slik at raden ikke returneres. Det gjelder også hvis den sammenlignede verdien selv er tom.

Antall Forespørsler til Plattformen

En korrelert underforespørsel omskrives til en join for utførelsen. Hver datakilde leses dermed et fast antall ganger, uavhengig av antall rader i forespørselen rundt.

Uten denne omskrivelsen ville underforespørselen blitt utført én gang per rad, noe som på en plattform som blir nådd via skyen betyr 1 forespørsel per rad.

Begrensning

En underforespørsel i en order by støttes foreløpig ikke.

Tilgjengelighet

Korrelaterte underforespørsler er tilgjengelige fra utgivelse 27.0 for alle plattformer.

Se også