- - PR -
SQLでできますでしょうか
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-09-12 20:39
SQLで実現できるかお教えください。
以下の状態のテーブルがあるとします id name ------------ 2 aaa 3 fff 4 ddd 6 www このテーブルより新規にidのわりだし行い、 新規にデータの追加を行うのですが、 次に追加されるデータのidは1を割り当てたいと 考えています。歯抜けのid番号の中より 抜けている数字を取得し、その中で一番小さい数字を 取得する事はSQL文で実現可能でしょうか? よろしくお願いいたします。 [ メッセージ編集済み 編集者: コデトン 編集日時 2005-09-12 20:39 ] | ||||
|
投稿日時: 2005-09-12 20:54
こんな感じでいかがでしょうか。かなり遅いと思いますが。
SELECT MIN(A.ID+1) FROM TEST A LEFT OUTER JOIN TEST B ON A.ID+1=B.ID WHERE B.ID IS NULL | ||||
|
投稿日時: 2005-09-12 21:46
お疲れ様です。 ・相関副問い合わせ ・SQL Server ・ID 値は1以上で Not Null で行くとこんな感じでしょうか? 歯抜けがある場合はその値を 歯抜けがない場合は次の値を返します。 [code]----- SELECT IsNull(MIN([ID]) - 1, (SELECT MAX([ID]) + 1 FROM [TBL])) AS [NewID] FROM [TBL] AS [A] WHERE (Not EXISTS(SELECT [ID] FROM [TBL] AS [B] WHERE [ID] = [A].[ID] - 1)) AND ([ID] > 1) [code]----- ---------- TimberLandChapel http://blogs.timberlandchapel.com/blogs/timberlandchapel/ | ||||
|
投稿日時: 2005-09-12 22:34
TLCさんの案でも競合が起きます。
成功するまで繰り返す必要があるかもしれません。 そこまでコストの高い方式を取らなくてすむようにしたほうが望ましいですね。 _________________ 中博俊 MSMVP Visual Studio C# Since 2004/04-2005/03, MCP http://naka.wankuma.com/ http://blogs.wankuma.com/naka/ naka@wankuma.com | ||||
|
投稿日時: 2005-09-13 09:41
DBMSが書かれていないので、出来ると言い切れませんが、 Oracleの場合、このようなSQLで実現できるのでは・・・?と 思いました。 SELECT NVL( MAX ( ID ) , 0 ) + 1 '--0件時対応でNVLがついている FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY ID ) NO, ID FROM TABLE ) WHERE NO = ID; [ メッセージ編集済み 編集者: 夏椰(かや) 編集日時 2005-09-13 09:42 ] | ||||
|
投稿日時: 2005-09-13 11:05
insert into テーブル名 select
の構文で、IDを求めるselect文を使えばいいと思います oracleSQLパズル http://oraclesqlpuzzle.hp.infoseek.co.jp/2-3-1.html セルコ氏の方法(英語) http://www.celko.com/puzzles.htm [ メッセージ編集済み 編集者: 重蔵 編集日時 2005-09-14 13:51 ] | ||||
|
投稿日時: 2005-09-13 11:34
皆様お返事ありがとうございます。
DBはSQLServer2000となります。 |
1