我想在查询表中查找不存在的数据并不容易,但这可能是在一个整数列(rowindex)中实现漏洞的一些技巧。
这是用于说明具体情况的小表:
DROP TABLE IF EXISTS examtable1;
CREATE TABLE examtable1
(rowindex integer primary key, mydate timestamp, num1 integer);
INSERT INTO examtable1 (rowindex, mydate, num1)
VALUES (1, '2015-03-09 07:12:45', 1),
(3, '2015-03-09 07:17:12', 4),
(5, '2015-03-09 07:22:43', 1),
(6, '2015-03-09 07:25:15', 3),
(7, '2015-03-09 07:41:46', 2),
(10, '2015-03-09 07:42:05', 1),
(11, '2015-03-09 07:45:16', 4),
(14, '2015-03-09 07:48:38', 5),
(15, '2015-03-09 08:15:44', 2);
SELECT rowindex FROM examtable1;
使用show query我会列出所有使用过的索引
但我想得到(比方说)错过的前五个索引,以便我可以使用它们在所需的rowindex上插入新数据。
在具体的例子中,结果将是:2,4,8,9,12,它们代表未使用的索引。
这里有什么技巧可以构建一个能够提供n个缺失索引的查询吗? 实际上,这样的表可能包含许多行,“孔”可以在任何地方。
答案 0 :(得分:3)
您可以使用generate_series()
生成所有数字的列表,然后检查表格中不存在哪些数字。
这可以使用外部联接来完成:
select nr.i as missing_index
from (
select i
from generate_series(1, (select max(rowindex) from examtable1)) i
) nr
left join examtable1 t1 on nr.i = t1.rowindex
where t1.rowindex is null;
或not exists
查询:
select i
from generate_series(1, (select max(rowindex) from examtable1)) i
where not exists (select 1
from examtable1 t1
where t1.rowindex = i.i);
我使用了generate_series()
的硬编码下限,这样你也可以检测到一个小于最小数字的缺失rowindex。