アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問させていただきます。

OracleのUPDAE文を作成しています。

以下のようなSQLを作成したところ、問題無く動きました。


UPDATE テーブルA A
SET A.支払金額 = (SELECT B.支払金額
FROM テーブルB B
WHERE B.コード = A.コード )

そこで、テーブルAの「コード=XXX」のデータだけ更新しようします。


UPDATE テーブルA A
SET A.支払金額 = (SELECT B.支払金額
FROM テーブルB B
WHERE B.コード = A.コード )
WHERE A.コード = 'XXX'

このSQLも問題無く動きます。
ただ、以下に変更すると、「A.支払金額にNULLを更新できない」と怒られます。


UPDATE テーブルA A
SET A.支払金額 = (SELECT B.支払金額
FROM テーブルB B
WHERE B.コード = A.コード
AND A.コード = 'XXX' )

なぜ②はいいのに、③はだめなのでしょう?

また、AとBの支払金額が異なるデータのみUPDATEしたいと思い
以下のSQLを実行しましたが、③と同じエラーになります。


UPDATE テーブルA A
SET A.支払金額 = (SELECT B.支払金額
FROM テーブルB B
WHERE B.コード = A.コード
AND A.支払金額 = B.支払金額)

条件なので、③も④も動くと思っていたのですが、
なぜ実行できないのかわかっていません。


わかる方、教えていただけると嬉しいです。

A 回答 (3件)


UPDATE テーブルA A
SET A.支払金額 = (SELECT B.支払金額
FROM テーブルB B
WHERE B.コード = A.コード )
WHERE A.コード = 'XXX'

これを日本語に翻訳すると、以下のようになります。
ーーーーーーーーーーーーーーーーーーーーーーー
テーブルA の A.コード が 'XXX' のものについて更新する。
そのとき、A.支払金額 には B.コード が A.コード である B.支払金額 を代入する。
ーーーーーーーーーーーーーーーーーーーーーーー


UPDATE テーブルA A
SET A.支払金額 = (SELECT B.支払金額
FROM テーブルB B
WHERE B.コード = A.コード
AND A.コード = 'XXX' )

テーブルA の すべてのレコードを更新する。
そのとき、A.支払金額 には B.コード が A.コード でかつ 'XXX' である B.支払金額 を代入する。
(上記条件に当てはまらない場合は、B.支払金額 は NULL を返す。そして、A.支払金額 が NULL を受け付けない設定ならばエラーとなる。)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご説明いただき、すっきりしました。
A.支払金額がNULL登録可能だったら、
データがおかしくなるところでした。。。

お礼日時:2021/04/09 19:15

③と④は全レコードが更新対象ですからね。


当たり前です。

それに対して更新する値として、特定のコードで条件ぶつけても、結合条件に合致するレコードがなかったからnull更新になり、その項目はnot nullなんでしょうね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

一致させるための条件に注目しすぎ、
全レコードであることが理解できていませんでした。。。

お礼日時:2021/04/09 19:19

update文では、一意に決まる必要があります。



③の動かない理由は、推測ですが、複数行が服問い合わせから戻ってませんか?

④についても、適切なWhere句が必要だと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
一意の確認には気を付けるように致します。

お礼日時:2021/04/09 19:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す