496656 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

Road to DBD

Road to DBD

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

カレンダー

カテゴリ

バックナンバー

2024.03
2024.02
2024.01
2023.12
2023.11

キーワードサーチ

▼キーワード検索

プロフィール

ジャムシード

ジャムシード

コメント新着

mayggW@ продвижение раскрутка сайта договор Заказать seo поисковую оптимизацию сайт…
通りすがりプログラマー@ Re:複数テーブルによるUPDATE(02/11) 随分前の記事にコメント失礼します。 rown…
ワンコ0995@ Re:包含データベース(06/02) ((データベース)データベース,)デー…
しぐしぐ@ Re:TOP 100 PERCENT(05/08) お世話になっております。 最近、旧システ…
ハニー@ Re:INSTEAD OFトリガの限界(07/16) 1SQLでやらずに変数に入れればいいじゃん
2009.02.11
XML
カテゴリ:DB-Oracle
Oracleで、複数テーブルによる更新を行う場合、通常以下のように書くことが多い。

UPDATE TBL2 a
SET (F1,F2)=(SELECT F1,F2 FROM TBL1 WHERE KEY=a.KEY);

ただ、このサブクエリによる更新は件数が多いと時間がかかる。
その場合、クエリによる更新が使える。

UPDATE (
SELECT a.F1 AF1,a.F2 AF2, b.F1 BF1, b.F2 BF2
FROM TBL2 a
INNER JOIN TBL1 b ON b.KEY=a.KEY)
SET AF1=BF1,AF2=BF2;

ただし、この書式は結構制約が多い。
以下の書き方はできない。

UPDATE (
SELECT a.F1 AF1,a.F2 AF2, b.F1 BF1, b.F2 BF2
FROM TBL2 a
INNER JOIN TBL1 b ON b.KEY=a.KEY)
SET (AF1,AF2)=(BF1,BF2);

ORA-01767: UPDATE ... SET式は副問合せである必要があります

また、対象テーブルに主キーが設定されていないと、

ORA-01779: キー保存されていない表にマップする列は変更できません

上記は主キーを設定すればうまくいくが、ROWNUM疑似列を使って更新するケースでは、
UPDATE (
SELECT a.F1,b.SEQ
FROM TBL2 a
INNER JOIN
(SELECT KEY,ROWNUM SEQ FROM (SELECT KEY FROM TBL1 ORDER BY KEY DESC)) b ON b.KEY=a.KEY)
SET F1=SEQ;

ORA-01779: キー保存されていない表にマップする列は変更できません

これはROW_NUMBERを使っても同じ。
UPDATE (
SELECT a.F1,b.SEQ
FROM TBL2 a
INNER JOIN
(SELECT KEY,ROW_NUMBER() OVER (ORDER BY KEY DESC) SEQ FROM TBL1) b ON b.KEY=a.KEY)
SET F1=SEQ;

ORA-01779: キー保存されていない表にマップする列は変更できません

この場合は、時間がかかっても以下の方法しかない。
UPDATE TBL2 a
SET F1=(SELECT SEQ FROM (SELECT KEY,ROWNUM SEQ FROM (SELECT KEY FROM TBL1 ORDER BY KEY DESC)) WHERE KEY=a.KEY)





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2009.02.11 20:07:36
コメント(2) | コメントを書く
[DB-Oracle] カテゴリの最新記事



© Rakuten Group, Inc.