这是一个很常见的问题:在不创建表的情况下动态生成关系。这个问题的 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
每个值一个很长的链。此外,您可以在一处指定所需值的列表,这样更方便和可读。