选择不在列中的数字

时间:2011-08-31 15:38:23

标签: sqlite

我有一个整数类型的列,到目前为止记录的数字从1到270。我想编写一个查询,返回1到270之间不在数据库中的数字。 例如缺少5号,10号,15号,117号。所以查询应该返回这些数字。 并且有一些数字丢失,因为记录数量少于270,用眼睛搜索它是不切实际的。

谢谢

1 个答案:

答案 0 :(得分:3)

进行自我加入以查找连续的号码,如果没有匹配,则您的号码丢失。

SELECT t1.i-1 AS missing_i
FROM thetable t1 LEFT OUTER JOIN thetable t2 ON t1.i-1 = t2.i
WHERE t2.i IS NULL

但是这并没有发现所有缺失的数字,只有少于一个数字的数字。如果你的所有差距只有一个数字,这是可以的。但如果您的间隙是两个或更多数字的序列,则可能必须使用替代技术:

创建一个表并用至少1到270的整数填充它:

CREATE TABLE n (i INT AUTO_INCREMENT PRIMARY KEY, dummy INT);
INSERT INTO n (dummy) VALUES (0);          -- now you have 1 row
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 2 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 4 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 8 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 16 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 32 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 64 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 128 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 256 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 512 rows

现在,您可以执行外部联接以搜索原始表中缺少的整数:

SELECT n.i AS missing_i
FROM n LEFT OUTER JOIN thetable t ON n.i = t.i
WHERE n.i <= 270 AND t.i IS NULL
相关问题