Това е доста често срещан проблем:генериране на релация в движение без създаване на таблица. SQL решенията за този проблем са доста неудобни. Един пример за използване на производна таблица:
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;
Но това не се мащабира много добре, защото може да имате много стойности вместо само шест. Може да стане уморително да се създаде дълъг списък с един UNION
необходими за стойност.
Друго решение е да държите под ръка таблица с общо предназначение от десет цифри и да я използвате многократно за множество цели.
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;
Показвам вътрешната заявка, генерираща стойности от 0..99, въпреки че това не е необходимо за този случай. Но може да имате стойности, по-големи от 10 в списъка си. Въпросът е, че с една таблица num
, можете да генерирате големи числа, без да се налага да прибягвате до много дълги вериги с един UNION
на стойност. Освен това можете да посочите списъка с желаните стойности на едно място, което е по-удобно и по-четливо.