2007/02/28(Wed) 12:54:33 編集(投稿者)
■No1598 (road_movie さん) に返信
ありがとうございます。
> こんにちは
> Oracleは分かりませんがこちらはどうですか?
>
> http://codezine.jp/a/article/aid/652.aspx
うわ、すごいシンプルですねぇ。
自分でもさらに探して、
http://www.accessclub.jp/bbs/0115/beginers39524.html
というのを見つけました。
で、
「外部結合して NULL かどうか見るくらいなら、EXISTS 使うべきだろう」
ということで、以下のような SQL にたどり着きました。
教えていただいた codezine の例も、EXISTS の代わりに IN を使っているだけで、本質的には同じですね。
SELECT
NVL( MIN( 番号 ) + 1, 1 )
FROM
(
SELECT
番号
FROM
テーブル T1
WHERE
NOT EXISTS
(
SELECT
*
FROM
テーブル T2
WHERE
T1.番号 + 1 = T2.番号
)
)
ただ、テーブルが1つならこれでいいですが、実は、要件としては
「2つのテーブルで重複しない整数値」が必要です。
例えば、
テーブルA:1, 3, 7
テーブルB:2, 4, 5
だったら、(AとBのどちらに新しいレコードを作るにせよ)次の値は6、
その次は8である必要があります。
こんなのをこの方法で解こうとすると結合が複雑になりすぎるので、
「削除した番号を持つテーブル」を作るか、「2つのテーブルの
共通部分を1つのテーブルにまとめるよう変更する」かを提案したいと思います。
#そのような要件のないテーブルには、この結果を生かさせて頂きます。