3

テーブルには、ID が 2,4,5,8 のレコードがあります。値が 1、3、6、7 のリストを受け取るにはどうすればよいですか。私はこの方法で試しました

SELECT t1.id + 1
FROM table t1
WHERE NOT EXISTS (
    SELECT * 
    FROM table t2
    WHERE t2.id = t1.id + 1
)

しかし、正しく動作していません。利用可能なすべてのポジションを提供するわけではありません。

別のテーブルがなくても可能ですか?

4

1 に答える 1

4

次のように、再帰 CTE から不足しているすべての ID を取得できます。

with recursive numbers as (
  select 1 number
    from rdb$database
  union all
  select number+1
    from rdb$database
         join numbers on numbers.number < 1024
)
select n.number
  from numbers n
 where not exists (select 1 
                     from table t
                    where t.id = n.number)

私の例のnumber < 1024条件は、クエリを最大 1024 の再帰深度に制限します。その後、クエリはエラーで終了します。1024 を超える連続したIDが必要な場合は、生成される数値の間隔を調整してクエリを複数回実行するか、そのレベルの再帰に達することなく連続した数値を生成する別のクエリを考えます。これはそれほど難しくありません。

于 2013-01-29T19:33:32.917 に答える