Ini adalah masalah yang cukup umum:menghasilkan relasi dengan cepat tanpa membuat tabel. Solusi SQL untuk masalah ini cukup canggung. Salah satu contoh menggunakan tabel turunan:
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;
Tetapi skala ini tidak terlalu baik, karena Anda mungkin memiliki banyak nilai, bukan hanya enam. Akan melelahkan untuk membuat daftar panjang dengan satu UNION
dibutuhkan per nilai.
Solusi lain adalah menyimpan tabel tujuan umum yang terdiri dari sepuluh digit, dan menggunakannya berulang kali untuk berbagai tujuan.
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;
Saya menunjukkan kueri dalam yang menghasilkan nilai dari 0,.99 meskipun ini tidak diperlukan untuk kasus ini. Tetapi Anda mungkin memiliki nilai yang lebih besar dari 10 dalam daftar Anda. Intinya dengan satu tabel num
, Anda dapat menghasilkan jumlah besar tanpa harus menggunakan rantai yang sangat panjang dengan satu UNION
per nilai. Selain itu, Anda dapat menentukan daftar nilai yang diinginkan di satu tempat, yang lebih nyaman dan mudah dibaca.