Subquery in SQL

Posted on

SQL 2005/2008 is met ruime voorsprong de meest populaire SQL server op de markt, de kostprijs zal daar voor een belangrijk stuk tussenzitten. En hoewel het een goed product is zijn er toch een aantal kleine zaken die niet helemaal lopen zoals we het wensen.

Neem nu dit stukje SQL code: “select * from tabel where (veld1, veld2) not in (select velda, veldb from tabel2).  Om het concreter te stellen. Neem de eerste tabel als zijnde de tabel met daarin alle cursussen van een school (veld1 : klas, veld2 : vak). Een tweede tabel bevat alle factuur lijnen van het programma waarmee de cursussen gefactureerd worden. Ik wil nu weten welke cursussen nog niet gefactureerd werden.  Ik wil met andere woorden weten welke records met een bepaalde combinatie “klas vak” in tabel1 niet voorkomen in tabel2.

In MS SQL lukt dat niet met bovenstaande query.  Een alternatief lijkt “select * from tabel where veld1 not in (select velda from tabel2) and veld2 not in (select veldb from tabel2)” maar uiteraard niet hetzelfde resultaat.  Want neem nu dat we al gefactureerd hebben “klas 1BEC, vak Boekhouden” en “klas 1BEC, vak Marketing” en “klas 2BEC en vak Geschiedenis” dan zal in ons resultaat de klas 2BEC met het vak Marketing niet meer voorkomen omdat zowel marketing in de DB zit en 2BEC, de combinatie van beide echter nog niet.

Overstappen naar Oracle kan een oplossing zijn als je je opdrachtgever kan overtuigen. De DDIT oplossing is een stuk eenvoudiger met name deze query “select * from tabel where (veld1+’@@@@’+veld2) not in (select velda+’@@@@’+veld2 from tabel2)”. Waarbij we de twee velden aan elkaar gaan hangen met daartussen een scheidingsteken. Het scheidingsteken mag om het even wat zijn als het maar niet frequent voorkomt in de desbetreffende velden.  Het mag dan een pruts oplossing lijken, ze werkt prima en is ook nog eens super performant.

Hebt u hier verder nog vragen of problemen mee? Dan hoor ik graag van u!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.