(TBL_A)
A1 A2
-----------
1 100
2 200
3 300
4 400
5 500
(TBL_B)
B1 B2
-----------
1 100
3 300
4 400
上記のようなテーブルAとBがあったとして
次のようなUPDATE文を実行することはできますか?
できない場合、SQL1発で更新する他の方法はありますでしょうか?
UPDATE TBL_A A SET
A.A1 = A.A1 + B.B1
A.A2 = A.A2 + B.B2
WHERE EXISTS
(SELECT 'X' FROM TBL_B B WHERE A.A1=B.B1)
【更新後のTBL_A表】
A1 A2
-----------
1 200 <= (*)更新される
2 200
3 600 <= (*)更新される
4 400
5 1000 <= (*)更新される
【やりたいこと】
TBL_A表のA2列のデータにTBL_B表のB2列のデータを加算したい。
その場合の更新条件として「A1がB1に存在している場合のみ」という条件を加えたいのです。
すいませんが、よろしくおねがいします。
No.2ベストアンサー
- 回答日時:2006/09/21 10:42
>次のようなUPDATE文を実行することはできますか?
エラーになり実行できないと思いますがどうですか???
SET文に、
A.A1 = A.A1 + B.B1
と書いても、「B.B1」がなんのことか、DB側には分かりません。
EXISTSはあくまで、「Bに存在する行を」という更新の対象の行を絞る条件にしかならないので、
SET文でBのB1値を使いたいなら連結しなくてはいけません。
副問い合わせにしたらいかがですか?
UPDATE TBL_A A
SET A.A2 =
(SELECT A.A2 + B.B2 FROM TBL_B B
WHERE A.A1 = B.B1)
WHERE EXISTS
(SELECT * FROM TBL_B B WHERE A.A1=B.B1)
こんなかんじです。
ちなみにEXISTS文なりなんなりの「A1がB1に存在している場合のみ」
というWhere句は必要です。
上記のSQLにEXISTS文がない場合、
Bに存在しないAの行(A1が2と5の場合)もUPDATE文の対象となり、
Bとの連結の結果がNULL値になるので、
その行のA2の値がNULLで更新されてしまいます。
NULL値の加算はNULLだからです。
↓以下のようになります。
A1 A2
-----------
1 200
2 Null
3 600
4 800
5 Null
あまり意味がわからないかもしれませんが、
とりあえず、簡単なテーブルでも作って、
試してみてはいかがでしょうか。
No.1
- 回答日時:2006/09/21 01:11
>次のようなUPDATE文を実行することはできますか?
という問いに対しては、
update TBL_A
set
A1=A1 + (select B1 from TBL_B where A1=B1),
A2=A2 + (select B2 from TBL_B where A1=B1)
where A1 in (select B1 from TBL_B);
で書けますが・・
>【やりたいこと】
>TBL_A表のA2列のデータにTBL_B表のB2列のデータを加算したい。
>その場合の更新条件として「A1がB1に存在している場合のみ」という条件を加えたいのです。
に沿ったSQLを書くなら・・
update TBL_A
set
A2=A2 + (select B2 from TBL_B where A1=B1)
where A1 in (select B1 from TBL_B);
で良いはずです。
なんで、A1へB1を加算するようなSQLを書くのか理解できません。
また、更新後のTBL_Aのサンプルも、【やりたいこと】とは
一致していません。(A1=4 および 5 に対する結果)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
UPDATE文のWHERE条件に他のテーブルのフィールドも入れたい
SQL Server
-
MAX値を条件にデータを取得するには?
SQL Server
-
3つの表の外部結合
Oracle
-
4
SQL 複数テーブルのupdate
Oracle
-
5
Oracle(オラクル)で、日付時刻型の検索方法について
Oracle
-
6
SELECTで1件のみ取得するには?
Oracle
-
7
他のテーブルを参照した値はupdateでsetできない?
Oracle
-
8
1テーブル&複数レコードの更新に対して1度のupdate文での処理方法
SQL Server
-
9
Inner join と Left joinの明確な違いは?
その他(データベース)
-
10
SQL、2つのテーブルで条件一致したものだけdeleteする方法は?
Oracle
-
11
Select文で2つのフィールドを加算した結果を取得したい
SQL Server
-
12
SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいので
Oracle
-
13
EXISTSを使ったDELETE文
SQL Server
-
14
SQLで複数のテーブルと結合したUPDATE文
Visual Basic(VBA)
-
15
update文で改行を入れる
Oracle
-
16
日付型カラムへのデータINSERT
Oracle
-
17
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
18
INSERT時に発番を行いたい
SQL Server
-
19
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
20
sqlplusで表示が変なので、出力を整形したい。
Oracle
関連するQ&A
- 1 2テーブル間でフィールドの更新、1回のUPDATEでできますか?
- 2 数値計算結果で更新するUPDATE文の書き方
- 3 SID、SERVICE_NAMES、GLOBAL_DBNAME、DB_NAME、DB_DOMAINの関係
- 4 Oracle 11g 表2の選択結果をキーにして表1を更新したい。 表1 コード 対照 aaaaa
- 5 SQLの書き方(UPDATE文)
- 6 Oracle UPDATE 文 を教えて下さい
- 7 Oracle 10g 複数のDELETE UPDATE INSERT文
- 8 ★★PL/SQLにてTBL内容をCSV出力するには?★★
- 9 DBMS_STATS.GATHER_DATABASE_STATSの使い
- 10 DBに新しいTBLを作成した際に初期エクステントサイズ(いわゆるIni
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
SQLでn番目からm番目を取得したい
-
5
selectの単純繰り返し
-
6
抽出結果を1件ずつ次の抽出条件...
-
7
UPDATE文でこのような更...
-
8
Oracle 10gで順序sequenceの作...
-
9
生年月日から年齢を取得する方法
-
10
ORDER BYを条件に一致した順に...
-
11
SELECT文の結果をDEFINEの値と...
-
12
大文字/小文字の区別しないで検...
-
13
PL/SQLにて、マスタから取得し...
-
14
SET句内で複数の条件を指定して...
-
15
SQL WHERE文のノットイコール...
-
16
ROWNUMについて
-
17
データ表示順序
-
18
SELECTで1件のみ取得するには?
-
19
3つの表の外部結合
-
20
sqlplusで表示が変なので、出力...
おすすめ情報
公式facebook
公式twitter