Đây là một vấn đề khá phổ biến:tạo quan hệ một cách nhanh chóng mà không cần tạo bảng. Các giải pháp SQL cho vấn đề này khá khó xử. Một ví dụ sử dụng bảng dẫn xuất:
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;
Nhưng điều này không mở rộng tốt lắm, bởi vì bạn có thể có nhiều giá trị thay vì chỉ sáu giá trị. Có thể trở nên mệt mỏi khi tạo một danh sách dài với một UNION
cần thiết cho mỗi giá trị.
Một giải pháp khác là giữ một bảng có mục đích chung gồm mười chữ số và sử dụng nó nhiều lần cho nhiều mục đích.
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;
Tôi hiển thị truy vấn bên trong tạo ra các giá trị từ 0..99 mặc dù điều này không cần thiết cho trường hợp này. Nhưng bạn có thể có các giá trị lớn hơn 10 trong danh sách của mình. Vấn đề là với một bảng num
, bạn có thể tạo số lượng lớn mà không cần phải sử dụng chuỗi rất dài với một UNION
mỗi giá trị. Ngoài ra, bạn có thể chỉ định danh sách các giá trị mong muốn ở một nơi, thuận tiện và dễ đọc hơn.