Toto je docela běžný problém:generování relace za běhu bez vytvoření tabulky. Řešení SQL pro tento problém jsou dost nešikovná. Jeden příklad s použitím odvozené tabulky:
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;
To se ale příliš neškáluje, protože můžete mít mnoho hodnot místo pouhých šesti. Může být únavné vytvářet dlouhý seznam s jedním UNION
potřebné na hodnotu.
Dalším řešením je mít po ruce všeobecnou tabulku s deseti číslicemi a opakovaně ji používat pro různé účely.
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;
Zobrazuji vnitřní dotaz generující hodnoty od 0..99, i když to v tomto případě není nutné. Ale můžete mít ve svém seznamu hodnoty větší než 10. Jde o to, že s jednou tabulkou num
, můžete generovat velká čísla, aniž byste se museli uchýlit k velmi dlouhým řetězcům s jedním UNION
za hodnotu. Také můžete zadat seznam požadovaných hodnot na jednom místě, což je pohodlnější a čitelnější.