Dette er et problem, der er ret almindeligt:at skabe en relation i farten uden at oprette en tabel. SQL-løsninger til dette problem er ret akavede. Et eksempel ved hjælp af en afledt 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;
Men dette skalerer ikke særlig godt, fordi du måske har mange værdier i stedet for kun seks. Det kan blive trættende at konstruere en lang liste med én UNION
nødvendig pr. værdi.
En anden løsning er at have en generel tabel med ti cifre ved hånden og bruge den gentagne gange til flere formål.
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;
Jeg viser den indre forespørgsel, der genererer værdier fra 0..99, selvom dette ikke er nødvendigt i dette tilfælde. Men du har muligvis værdier større end 10 på din liste. Pointen er, at med én tabel num
, kan du generere store tal uden at skulle ty til meget lange kæder med én UNION
pr værdi. Du kan også angive listen over ønskede værdier ét sted, hvilket er mere bekvemt og læsbart.