プロが教える店舗&オフィスのセキュリティ対策術

はじめまして。
副問い合わせを使った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)

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

A 回答 (1件)

これは明らかに結論が逆です。


【1】は失敗し、【2】は正しく更新されます。

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

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

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

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

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

お礼日時:2009/07/16 08:42

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