Jest to dość powszechny problem:generowanie relacji w locie bez tworzenia tabeli. Rozwiązania SQL dla tego problemu są dość niewygodne. Jeden przykład z użyciem tabeli pochodnej:
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;
Ale to nie skaluje się zbyt dobrze, ponieważ możesz mieć wiele wartości zamiast tylko sześciu. Tworzenie długiej listy z jednym UNION
może być męczące potrzebne na wartość.
Innym rozwiązaniem jest trzymanie pod ręką uniwersalnej tabeli zawierającej dziesięć cyfr i używanie jej wielokrotnie do wielu celów.
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;
Pokazuję wewnętrzne zapytanie generujące wartości od 0..99, mimo że nie jest to konieczne w tym przypadku. Ale możesz mieć na liście wartości większe niż 10. Chodzi o to, że z jedną tabelą num
, możesz generować duże liczby bez konieczności uciekania się do bardzo długich łańcuchów za pomocą jednego UNION
na wartość. Możesz także określić listę pożądanych wartości w jednym miejscu, co jest wygodniejsze i bardziej czytelne.