我有一个id范围(由startId和stopId定义)。我有一个包含一些记录的表(每个记录都有一个id - primaty键)。现在我需要选择表中不存在的指定范围内的所有ID。我正在使用postgres数据库。请建议我执行此类查询的选项。
答案 0 :(得分:3)
您可以查看generate_series()函数。
然后使用except子句来获得差异。
select s.a from generate_series(<start>, <stop>) as s(a)
except
select id from <myTable>
where <yourClause>
--order by a
请参阅SqlFiddle
答案 1 :(得分:1)
使用generate_series生成数字范围。然后减去已经使用的数字。
SELECT generate_series(startId, stopId)
EXCEPT
SELECT id FROM mytable;
答案 2 :(得分:1)
您可以使用:http://www.postgresql.org/docs/9.1/static/functions-srf.html
SELECT * FROM generate_series(startId,stopId) AS all_ids WHERE id NOT IN (SELECT id FROM table WHERE id
>= startId AND id <= stopId) as existent_ids;
答案 3 :(得分:0)
我没有在这里测试它,因为我对oracle数据库进行了这个查询,我稍微修改了一下以适应postgresql,所以它应该可以工作。
select startid, endid, (endid-startid)+1 amount from (
select m.yourID + 1 as startid,
(select min(yourID) - 1 from yourtable x where and x.yourID > m.yourID) as endid
from yourtable m left join
(select yourID-1 yourID from yourtable r) r on (m.yourID = r.yourID)
where r.yourID is null
) x
where endid is not null
order by amount desc, startid
让我知道它是否有效。