- PR -

SQLでできますでしょうか

1
投稿者投稿内容
ポーター
ベテラン
会議室デビュー日: 2005/02/03
投稿数: 50
投稿日時: 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 ]
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 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
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-09-12 21:46
引用:

コデトンさんの書き込み (2005-09-12 20:39) より:

歯抜けのid番号の中より
抜けている数字を取得し、その中で一番小さい数字を
取得する事はSQL文で実現可能でしょうか?




お疲れ様です。
・相関副問い合わせ
・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/
中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 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
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-09-13 09:41
引用:

コデトンさんの書き込み (2005-09-12 20:39) より:
このテーブルより新規にidのわりだし行い、
新規にデータの追加を行うのですが、
次に追加されるデータのidは1を割り当てたいと
考えています。歯抜けのid番号の中より
抜けている数字を取得し、その中で一番小さい数字を
取得する事はSQL文で実現可能でしょうか?

よろしくお願いいたします。


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/05
投稿数: 127
投稿日時: 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/02/03
投稿数: 50
投稿日時: 2005-09-13 11:34
皆様お返事ありがとうございます。
DBはSQLServer2000となります。
1

スキルアップ/キャリアアップ(JOB@IT)