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