Dit is een probleem dat vrij vaak voorkomt:het genereren van een relatie on-the-fly zonder een tabel te maken. SQL-oplossingen voor dit probleem zijn behoorlijk onhandig. Een voorbeeld van het gebruik van een afgeleide tabel:
SELECT n.id
FROM
(SELECT 2 AS id
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
UNION SELECT 6
UNION SELECT 7) AS n
LEFT OUTER JOIN foos USING (id)
WHERE foos.id IS NULL;
Maar dit schaalt niet erg goed, omdat je misschien veel waarden hebt in plaats van slechts zes. Het kan vermoeiend worden om een lange lijst te maken met één UNION
nodig per waarde.
Een andere oplossing is om een algemene tabel van tien cijfers bij de hand te houden en deze herhaaldelijk voor meerdere doeleinden te gebruiken.
CREATE TABLE num (i int);
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
SELECT n.id
FROM
(SELECT n1.i + n10.i*10 AS id
FROM num AS n1 CROSS JOIN num AS n10
WHERE n1.i + n10.i*10 IN (2, 3, 4, 5, 6, 7)) AS n
LEFT OUTER JOIN foos USING (id)
WHERE foos.id IS NULL;
Ik laat de innerlijke query zien die waarden genereert van 0..99, hoewel dit in dit geval niet nodig is. Maar mogelijk heeft u waarden groter dan 10 in uw lijst. Het punt is dat met één tabel num
, kunt u met één UNION
. grote aantallen genereren zonder toevlucht te hoeven nemen tot zeer lange ketens per waarde. U kunt ook de lijst met gewenste waarden op één plaats specificeren, wat handiger en leesbaarder is.