- - PR -
SQLについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-03-03 09:41
いつもお世話になっております。
現在キーをサイクリックして使用するテーブルを作成しています。 サイクリックは実現できたのですが、キー値が歯抜けになってしまう可能性を考慮しキーがは抜けになった場合、歯抜けになってしまっているキー値の位置にレコードを挿入する仕様を考えています。 そこでわからないのですが、SQLを使用しキーの歯抜け部分の値を取得することはできませんでしょうか? 例 Table_A key =1,data=xxx key =2,data=xxx key =4,data=xxx key =5,data=xxx というテーブルから3を取得するSQLは作成できないのでしょうか? 使用しているRDBMSはSQL-Server2005です。 Transact-SQLを使用して解決できればと考えています。 現在は、レコード件数が管理数に満たない場合は、CLRストアドプロシージャを使用して、keyをすべてチェックし取得しています。 | ||||||||
|
投稿日時: 2009-03-03 09:55
出来ません。 無効フラグフィールドを設けて、レコードの削除時にDELETEするのではなく、無効フラグを設定するようにするのが良いかと。レコードを追加する場合には無効フラグが立っているレコードをUPDATEします。 あるいはDELETE時に別テーブル(B)に削除したレコードのキーを格納しておき、追加するときには(B)テーブルからキーを取得して利用するとか。
↑もレコード数が少ないとか、パフォーマンス上の要求が緩いなら、十分有用な方法かと。 | ||||||||
|
投稿日時: 2009-03-03 10:14
今手元に環境が無いので、SQLServerで使えるかどうかわかりませんが、ご参考まで。
【SQL】連番の歯抜けの検索 | ||||||||
|
投稿日時: 2009-03-03 10:24
はseqが数値で、nullを含まない事が前提になります。 全部列挙したい場合はMINを外してください。 NULLを含むのであれば select [key] + 1 FROM Table_A A WHERE NOT EXISTS ( Select B.[key] FROM Table_A B where (A.[key] + 1) = B.[key]); かな? [ メッセージ編集済み 編集者: デューン 編集日時 2009-03-03 10:25 ] | ||||||||
|
投稿日時: 2009-03-03 16:17
上記のSQLの場合、最小値(あるいは最小値から連続する番号)が削除されていた場合、それを拾うことができません。 つまり、最小値が1なら、0の行が必要になります。 上記を踏まえ、改善してみました。
| ||||||||
|
投稿日時: 2009-03-04 08:52
甕星様、タコツボ様、デューン様、忠犬様回答ありがとうございます。
大変勉強になりました、皆さん本当にありがとうございます。 SQLひとつでここまでできるのですね、感激しています。 今回はDBへのストアドを使用できるので、以下のようなストアドを作成しました。 同じような案件で、ストアドを使用できない場合はぜひ使用させていただきたいと思います、ありがとうございました。 ALTER PROCEDURE [dbo].[Get_Insert_Key] @keyvalue integer OUTPUT AS BEGIN SET NOCOUNT ON; SELECT @keyvalue = MIN(key + 1) FROM Table_A WHERE (key + 1) NOT IN ( SELECT key FROM Table_A); IF @keyvalue IS NULL BEGIN SET @keyvalue = 1 END END | ||||||||
|
投稿日時: 2009-03-04 12:14
あかりさん、こんにちは。
せっかくなので、スカラ値@keyvalueを返すストアドファンクションの方が便利ではないでしょうか? | ||||||||
|
投稿日時: 2009-03-04 14:35
よっしー様回答ありがとうございます。
>せっかくなので、スカラ値@keyvalueを返すストアドファンクションの方が便利ではないでしょうか? とはどういうことでしょうか? 提示させていただいたようにした理由としましては、 あまりSQLを複雑にするとDBに負荷がかかる気がするという点。 ExecuteNonqueryでの実行がもっとも早いという程度の理由です。 もっとよい方法がありましたら、教えていただけたらありがたいです。 |