2

ID 範囲があります (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 に答える