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

解決済みの質問

update文におけるwhereとjoinの違いについて

はじめまして。
副問い合わせを使ったUPDATE文でわからない点があり、質問させていただきます。

使用しているDBはORACLE10gです。
SALARYとEMPLOYEESという二つのテーブルがあり、SALARY列とEMPLOYEES列には主キーとなるEMPLOYEEID列があります。
ここで、以下のSQLを発行した際に【1】は正しく更新され、【2】は「ORA-01427:単一行副問い合わせにより2つ以上の行が戻されます」というエラーが出ます。
whereを使った結合とjoinを使った結合は同じだと思っていたのですが、なぜこのように結果が異なるのかがわかりません。
どなたかご教示いただけないでしょうか。

【1】
UPDATE SALARY
SET SALARY.AMOUNT = SALARY.AMOUNT +
(SELECT AMOUNT FROM EMPLOYEES INNER JOIN SALARY s ON EMPLOYEES.EMPLOYEEID = s.EMPLOYEEID)

【2】
UPDATE SALARY
SET SALARY.AMOUNT = SALARY.AMOUNT +
(SELECT AMOUNT FROM EMPLOYEES WHERE SALARY.EMPLOYEEID = EMPLOYEES.EMPLOYEEID)

説明不足の点があればご指摘ください。よろしくお願いします。

投稿日時 - 2009-06-30 20:29:49

QNo.5087705

046

困ってます

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

これは明らかに結論が逆です。
【1】は失敗し、【2】は正しく更新されます。

【2】はいわゆる「相関副問い合わせ」なっており、副問い合わせの中でUPDATEの対象のSALARYテーブルを参照しています。したがって、SALARY1行につき正しくAMOUNTが1つ選択され、正しく更新されます。

一方、【1】は単なる「副問い合わせ」であり、副問い合わせの中のSALARYは更新対象となるSALARYとは別のテーブルと見なされています。
だから複数行が返ってエラーになります。
(おそらくこのケースではJOINを使った書き換えはできないのでは)

投稿日時 - 2009-06-30 21:19:45

お礼

jamshid6さん、回答ありがとうございました。
ご指摘のとおりでした。

相関副問い合わせというんですね。
これから勉強してきます。

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

投稿日時 - 2009-07-16 08:42:21

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

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

回答(1)