Een subquery kan nu een kolom gebruiken van de query eromheen.
Daarmee is een gebruikelijke manier om “de rij die bij deze rij hoort” te beschrijven beschikbaar in Invantive UniversalSQL, zoals in onderstaand voorbeeld. Tot nu toe gaf zo’n subquery de melding dat de kolom onbekend was.
Werking
Een subquery zoekt een naam eerst bij zijn eigen gegevensbronnen. Pas als hij de naam daar niet kent, kijkt hij naar de query eromheen, en daarna naar de query die daar weer omheen ligt. Een naam die op beide plaatsen bestaat verwijst dus naar de dichtstbijzijnde. Een kolom toevoegen aan een tabel kan de betekenis van een bestaande subquery daardoor niet veranderen.
Een correlatie mag over willekeurig veel niveaus naar buiten reiken en mag een niveau overslaan. Een subquery die twee niveaus diep ligt kan een kolom van de buitenste query gebruiken zonder dat de query ertussen een rol speelt.
De correlatie is toegestaan in dezelfde vormen als een subquery zonder correlatie: exists en not exists, in en not in, en de scalaire subquery. Die laatste levert één waarde en mag overal staan waar een expressie is toegestaan, dus ook in de selectielijst, in een berekening en in een case.
Voorbeeld: Bestaat er een Bijbehorende Rij
Het volgende voorbeeld selecteert de medewerkers van wie de afdeling voorkomt in de tweede gegevensverzameling. De subquery gebruikt emp.dept, een kolom van de query eromheen:
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
)
Dit levert één rij op met de waarde A100. Medewerker A200 werkt op een afdeling die de tweede verzameling niet kent.
Voorbeeld: Een Waarde Per Rij
Een scalaire subquery in de selectielijst telt de rijen die bij elke medewerker horen:
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
Dit levert A100 met 2 en A200 met 0 op. Een count over geen enkele bijbehorende rij is nul. Elke andere aggregatie, zoals max of sum, levert in die situatie de lege waarde op.
Lege Waarden
Een vergelijking met de lege waarde heeft geen uitkomst, en die uitkomst verschilt per vorm. Bij exists is een rij die met de lege waarde vergelijkt geen treffer, zodat de subquery niets vindt. Bij not in maakt één lege waarde tussen de opgeleverde waarden het antwoord onbeslist, waardoor de rij niet wordt opgeleverd. Dat geldt ook als de vergeleken waarde zelf leeg is.
Aantal Verzoeken Aan het Platform
Een gecorreleerde subquery wordt voor de uitvoering omgeschreven naar een join. Elke gegevensbron wordt daardoor een vast aantal keren gelezen, ongeacht het aantal rijen van de query eromheen.
Zonder die omschrijving zou de subquery één keer per rij worden uitgevoerd, wat op een platform dat via de cloud wordt benaderd 1 verzoek per rij betekent.
Beperking
Een subquery in een order by wordt nog niet ondersteund.
Beschikbaarheid
Gecorreleerde subqueries zijn beschikbaar vanaf release 27.0 voor alle platformen.
