- ベストアンサー
betweenで境界値が取得できない。
連番の歯抜け値を取得する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は境界値も対象になるはずですが、何故このような 結果になってしまうのでしょうか? 修正点をご教授いただけないでしょうか? 宜しくお願いします。
- みんなの回答 (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
その他の回答 (3)
- chukenkenkou
- ベストアンサー率43% (833/1926)
>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しか拾えないという意味です。 そういったケースがないなら、問題ありません。
- chukenkenkou
- ベストアンサー率43% (833/1926)
使用しているRDBMS名とバージョンを教えてください。 >SELECT MIN(カラムA + 1) > FROM テーブルA > WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) なお、この方法はエンジニア向けサイト等にも紹介されていますが、1の行がないと正しく動作しません。
補足
SQL server2005です。 1の行というのは、たとえば0,2,3,4…というようにデータが入って いる場合はうまくいかない、ということでしょうか?
- nfushi
- ベストアンサー率31% (39/122)
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 と記述しました。
補足
回答ありがとうございます。 最初のSQLは、 (カラムA + 1) BETWEEN~とすべきところを カラムA BETWEEN~としていたのがおかしかったようです。 >そういったケースがないなら、問題ありません。 1、2がないのに、BETWEENに1から10の範囲を設定することが あるので、そういう場合に困ってしまいますね…。