これは非常に一般的な問題です。テーブルを作成せずにその場でリレーションを生成します。この問題のSQLソリューションはかなり厄介です。派生テーブルを使用した1つの例:
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;
ただし、6つではなく多くの値がある可能性があるため、これはあまり適切にスケーリングされません。 1つのUNION
で長いリストを作成するのは面倒になる可能性があります 値ごとに必要です。
もう1つの解決策は、10桁の汎用テーブルを手元に置いておき、それを複数の目的に繰り返し使用することです。
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より大きい値がある場合があります。重要なのは、1つのテーブルでnum
、1つのUNION
で非常に長いチェーンに頼ることなく、多数を生成できます。 値ごと。また、必要な値のリストを1か所で指定できるため、より便利で読みやすくなります。