こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ROWNUMでUPDATEをしたいのですが・・・。

SQL初心者です。
以下のようなテーブルがあり、
ESTAB/PATTERN/NUMBER/CD
1/00/ 1/01
1/00/ 3/02
1/00/ 4/04
1/00/ 5/05
7/00/ 1/01
7/00/ 2/03
7/00/ 3/04
7/00/ 4/05
(主キー=ESTAB、PATTERN、NUMBER)

SELECT ROWNUM,ESTAB,PATTERN,NUMBER,CD FROM
(SELECT ESTAB,PATTERN,NUMBER,CD
FROM M_PATTERN
WHERE PATTERN='00'
AND ESTAB='1'
ORDER BY NUMBER)
WHERE
PATTERN='00'
AND ESTAB='1'
で検索したところの、ROWNUMでNUMBERを更新したいのですが、

UPDATE M_PATTERN A
SET A.NUMBER=
(SELECT ROWNUM FROM
(SELECT ESTAB,PATTERN,NUMBER FROM M_PATTERN WHERE PATURN='00' AND ESTAB='1' ORDER BY NUMBER) B
WHERE A.NUMBER=B.NUMBER AND A.PATTERN=B.PATTERN AND A.ESTAB=B.ESTAB AND B.PATTERN='00' AND B.ESTAB='1')
WHERE A.PATTERN='00' AND A.ESTAB='1'

としてみたところ、一意制約違反が発生してしまいます。

それとも、このようなUPDATEは無理なんでしょうか?

投稿日時 - 2006-09-13 15:01:37

QNo.2403738

すぐに回答ほしいです

質問者が選んだベストアンサー

ROWNUMを使った更新は不可能ではありません。
更新で使用しているサブクエリが、更新すべき値を1コ見つけてくるSQLであれば
正しく処理できます。

NUMBERカラムの再採番が目的だと思うので、

update M_PATTERN X
set
X.NUMBER=
(
select count(*) + 1
from M_PATTERN Y
where X.ESTAB=Y.ESTAB and X.PATTERN=Y.PATTERN and Y.NUMBER<X.NUMBER
)
where X.ESTAB='1' and X.PATTERN='00';

な感じで、ROWNUMを使わない解決が良いと思います。

投稿日時 - 2006-09-14 01:40:42

お礼

回答ありがとうございます。
ご推察の通り、再採番がしたかったんです。

確かに、それを目的とするならこちらの方がSQLがすっきりしていて、わかりやすいですね。
実行させたところ、意図した更新が出来ました。

ありがとうございました。

投稿日時 - 2006-09-14 09:17:19

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問