How to: Hoe gebruik ik de sample optie in SQL?

In Oracle bestaat de mogelijkheid om maar een gedeelte van een tabel op te nemen met behulp van de sampleoptie.
In de eenvoudigste vorm ziet dat er als volgt uit:

Select * from stafleden sample(15)

Nu wordt van de tabel stafleden bij benadering 15% van de rijen teruggeven. Eventueel bestaat de mogelijkheid om 15% van de blokken terug te geven:

Select * from stafleden sample block (15)

Wanneer om wat voor reden dan ook de query een paar keer herhaald moet worden en de uitkomst moet wel hetzelfde zijn dan kan de optie SEED gebruikt worden.
Daarbij moet een getal opgegeven worden tussen 0 en 4294967295

Select * from stafleden sample(15) seed (123489)

Een bijzonder situatie doet zich voor wanneer er aliassen benodigd zijn. Bijvoorbeeld in de query

Select s.*, sysdate from stafleden s

Vaak wordt daar op de volgende manier de sample clausule aan toegevoegd

Select s.*, sysdate from stafleden s sample (15)

Dat is echter geen correcte query. De sample clausule moet echt verwijzen naar de tabel. De correcte query ziet er als volgt uit:

Select s.*, sysdate from stafleden sample (15) s

Wanneer er meerdere tabellen nodig zijn krijg je hetzelfde probleem, je kunt niet van het eindresultaat een x percentage terugkrijgen . Het gebruik van haakjes en/of een inline view, het biedt allemaal geen soelaas. Een oplossing die wel werkt is om bij een query op tabellen die een rechte parent-child hebben de onderste child tabel de sample optie te geven:

Select s.naam staflid, a.naam afdeling, z.naam ziekenhuis
 From stafleden sample(15) inner join afdelingen a using
 (ziekhnr, afdnr) inner join ziekenhuizen using (ziekhnr)

De onderste tabel geeft nu grofweg 15% van de rijen terug. Alleen deze 15% gaat gekoppeld worden.
Niet nuttig, althans wij hebben nog geen toepassing bedacht, maar wel leuk om een keer te zien is het effect van het gebruik van een outer join die Oracle wel gewoon uitvoert:

Select s.naam staflid, a.naam afdeling, z.naam ziekenhuis
 From stafleden sample(15) right outer join afdelingen a using
 (ziekhnr, afdnr) inner join ziekenhuizen using (ziekhnr)

Meer over Oracle SQL leer je in onze SQL Opleidingen, Cursussen en Trainingen.

Onderwerpen
Actieve filters: Wis alle filters
Pageloader
PRIVACY VOORWAARDEN

Jouw persoonsgegevens worden opgenomen in onze beschermde database en worden niet aan derden verstrekt. Je stemt hiermee in dat wij jou van onze aanbiedingen op de hoogte houden. In al onze correspondentie zit een afmeldmogelijkheid