2

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

4

4 回答 4

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

于 2013-11-14T13:21:07.530 回答
2

您可以使用: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;
于 2013-11-14T13:23:32.200 回答
1

使用 generate_series 生成数字范围。然后减去已经使用的数字。

SELECT generate_series(startId, stopId)
EXCEPT
SELECT id FROM mytable;
于 2013-11-14T13:23:01.167 回答
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

让我知道它是否有效。

于 2013-11-14T13:20:57.227 回答