选择表中不存在的ID

时间:2013-11-14 13:12:04

标签: sql database postgresql

我有一个id范围(由startId和stopId定义)。我有一个包含一些记录的表(每个记录都有一个id - primaty键)。现在我需要选择表中不存在的指定范围内的所有ID。我正在使用postgres数据库。请建议我执行此类查询的选项。

4 个答案:

答案 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

让我知道它是否有效。