2

0 から 43 までの値 (両方を含む) を持つ int 値の列を持つテーブルがあります。

テーブルにない範囲 [0,44) の最小値を返すクエリが必要です。

例:
テーブルに 3,5, 14 が含まれている場合、クエリは
、テーブルに 0,1, 14 が含まれている場合、 0 を返す必要
があります。テーブルに 0,3, 14 が含まれている場合、クエリは 2 を返す必要があります。 1

テーブルにすべての値が含まれている場合、クエリは空を返す必要があります。

どうすればそれを達成できますか?

4

4 に答える 4

5

必要0な値は、テーブルに存在する値よりも大きいか 1 であるため、そのまま実行できます。

SELECT MIN(value)
FROM (SELECT 0 value UNION SELECT value+1 FROM MyTable) a
WHERE value < 44 AND value NOT IN (SELECT value FROM MyTable)

でテストする SQLfiddle

于 2013-08-09T06:14:37.097 に答える
1

1 つの方法は、整数を含む別のテーブルを作成し[0,43]、それを結合して NULL を探すことです。NULL は、欠落している値を示します。

あなたが持っていると仮定します:

create table numbers (n int not null);

このテーブルには、0 から 43 までの整数が含まれています (包括的)。テーブルに関心のある数値を保持tする列がある場合、次のようになります。n

select n.n
from numbers n left join t on n.n = t.n
where t.n is null
order by n.n
limit 1

あなたが求めている結果が得られるはずです。

これは、シーケンスを操作する場合のかなり一般的な SQL 手法です。最も一般的な用途は、おそらくカレンダー テーブルです。

于 2013-08-09T05:56:56.087 に答える
0

1 つのアプローチは、整数値を含む 44 行のセットを生成し、テーブルからの個別の値のセットに対してアンチ結合を実行し、最小値を取得することです。

SELECT MIN(r.val) AS min_val
  FROM ( SELECT 0 AS val UNION ALL
         SELECT 1 UNION ALL
         SELECT 2 UNION ALL
         SELECT 3 UNION ALL
         SELECT 4 UNION ALL
         SELECT 5 UNION ALL
         -- ... 
         SELECT 44 
       ) r
  LEFT
  JOIN ( SELECT t.int_valued_col
           FROM mytable t
          WHERE t.int_valued_col >= 0
            AND t.int_valued_col <= 43
          GROUP BY t.int_valued_col
       ) v
    ON v.int_valued_col = r.col
 WHERE v.int_valued_col IS NULL
于 2013-08-09T06:01:45.947 に答える