Dies ist ein ziemlich häufiges Problem:Generieren einer Relation im laufenden Betrieb, ohne eine Tabelle zu erstellen. SQL-Lösungen für dieses Problem sind ziemlich umständlich. Ein Beispiel mit einer abgeleiteten Tabelle:
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;
Aber das lässt sich nicht sehr gut skalieren, weil Sie vielleicht viele Werte statt nur sechs haben. Es kann lästig werden, eine lange Liste mit einer UNION
zu erstellen pro Wert benötigt.
Eine andere Lösung besteht darin, eine Allzwecktabelle mit zehn Ziffern zur Hand zu haben und sie wiederholt für verschiedene Zwecke zu verwenden.
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;
Ich zeige die innere Abfrage, die Werte von 0..99 generiert, obwohl dies für diesen Fall nicht erforderlich ist. Ihre Liste enthält jedoch möglicherweise Werte über 10. Der Punkt ist der mit einer Tabelle num
, können Sie mit einer UNION
große Zahlen generieren, ohne auf sehr lange Ketten zurückgreifen zu müssen pro Wert. Außerdem können Sie die Liste der gewünschten Werte an einer Stelle angeben, was bequemer und lesbarer ist.