重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【解消】通知が届かない不具合について

連番の歯抜け値を取得するSQLを作りたいと思っています。
例えば、カラムAに、1,2,3,5,6,7,9,10(4と8が抜けている)
と数値の入っているテーブルAがあるとします。
これに対して、

SELECT MIN(カラムA + 1)
FROM テーブルA
WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA)

とSQLを投げた場合、4が取得できます。

これにbetween句を付与したいのですが、そうすると境界値が
なぜか取れなくて困ってます。
具体的には、

SELECT MIN(カラムA + 1)
FROM テーブルA
WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA)
AND BETWEEN 8 AND 10
とした場合、NULLが返ってきてしまいます。

普通、BETWEENは境界値も対象になるはずですが、何故このような
結果になってしまうのでしょうか?
修正点をご教授いただけないでしょうか?

宜しくお願いします。

A 回答 (4件)

SQL Server 2005で動けばいいのですよね?



SQL例です。

select coalesce(max(seq), 0) + 1 as gap
from (select seq, Row_Number() over(order by seq) as Rank
from SeqTbl)
where seq = Rank;

http://codezine.jp/a/article/aid/1269.aspx
    • good
    • 0

>SQL server2005です。



当方、SQL Server 2005 Expressを使っていますが、こちらでは想定通り動きます。提示のデータ例、SQL例が実際に実行しているものと合致していないのではないでしょうか?

>1の行というのは、たとえば0,2,3,4…というようにデータが入っている場合はうまくいかない、ということでしょうか?

1からの連番とした場合、「1」や「1と2」といった最初の番号が欠番となっている場合、その値は拾えないという意味です。

例えば、
3,5,6,7,9,10(1~2、4と8が抜けている)
といった場合は、欠番の最小値として4しか拾えないという意味です。
そういったケースがないなら、問題ありません。

この回答への補足

回答ありがとうございます。
最初のSQLは、 (カラムA + 1)  BETWEEN~とすべきところを
カラムA BETWEEN~としていたのがおかしかったようです。

>そういったケースがないなら、問題ありません。

1、2がないのに、BETWEENに1から10の範囲を設定することが
あるので、そういう場合に困ってしまいますね…。

補足日時:2008/06/20 22:41
    • good
    • 0

使用しているRDBMS名とバージョンを教えてください。



>SELECT MIN(カラムA + 1)
> FROM テーブルA
> WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA)

なお、この方法はエンジニア向けサイト等にも紹介されていますが、1の行がないと正しく動作しません。

この回答への補足

SQL server2005です。

1の行というのは、たとえば0,2,3,4…というようにデータが入って
いる場合はうまくいかない、ということでしょうか?

補足日時:2008/06/19 11:20
    • good
    • 0

SELECT MIN(カラムA + 1)


FROM テーブルA
WHERE (カラムA + 1) NOT IN
(SELECT カラムA FROM テーブルA
WHERE カラムA BETWEEN 8 AND 10)

ということでしょうか?

この回答への補足

スイマセン、SQL間違ってましたね。

SELECT MIN(カラムA + 1)
FROM テーブルA
WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA)
AND カラムA BETWEEN 8 AND 10

と記述しました。

補足日時:2008/06/18 22:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す