Stel je hebt een database met daarin 2 tabellen die doormiddel van een key aan elkaar zijn gekoppeld. Dan kan het soms voorkomen dat je meerdere rijen uit de ene tabel als veld wil weergeven bij de andere tabel.
Hieronder staat de MSSQL oplossing. Voor deze oplossing maken we een nieuwe “Scalar Function” aan. Deze functie kan je vervolgens aanroepen in je query. Een persoon met een of meerdere lievelingskleuren bijvoorbeeld.
De tabelen zien er als volgt uit.
id naam (Tabel Personen)
1 Jan
2 Piet
3 Sjaak
4 Kees
id persoonId kleur (Tabel Kleuren)
1 1 Rood
2 1 Blauw
3 2 Groen
4 3 Blauw
5 3 Rood
6 3 Groen
We maken de volgende functie aan:
| 01 | |
| 02 | CREATE FUNCTION [dbo].[KleurenPerPersoon] |
| 03 | ( |
| 04 | @persoonId int |
| 05 | ) |
| 06 | RETURNS varchar(max) |
| 07 | AS |
| 08 | BEGIN |
| 09 | declare @output varchar(max) |
| 10 | declare @outputNV varchar(max) |
| 11 | SELECT @output = COALESCE(@output + '/','') + dbo.Kleuren.kleur |
| 12 | FROM dbo.Kleuren |
| 13 | WHERE dbo.Kleuren.persoonId = @persoonId |
| 14 | ORDER BY kleur; |
| 15 | |
| 16 | SET @outputNV = (SELECT ISNULL(@output,'Geen')); |
| 17 | RETURN @outputNV |
| 18 | END |
Nu we deze functie hebben aangemaakt moeten we hem nog aanroepen vanuit de query. Dat gaat als volgt: Je selecteert de persoon. En je stuurt zijn id naar de goede functie.
| 1 | |
| 2 | SELECT Personen.naam, dbo.KleurenPerPersoon(kleuren.id) as lievelingskleuren |
| 3 | FROM Personen |
| 4 | ORDER BY naam; |
Het lijstje wat uit deze query voortkomt is als volgt:
Jan Blauw/Rood
Kees Geen
Piet Groen
Sjaak Blauw/Groen/Rood
De slashes tussen de kleuren staan in de functie. Dat er bij Kees geen staat klopt omdat we in de functie kijken of de waarde iets heeft en anders vervangen we de lege waarde door “Geen”.