
はじめまして。
副問い合わせを使った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)
説明不足の点があればご指摘ください。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
これは明らかに結論が逆です。
【1】は失敗し、【2】は正しく更新されます。
【2】はいわゆる「相関副問い合わせ」なっており、副問い合わせの中でUPDATEの対象のSALARYテーブルを参照しています。したがって、SALARY1行につき正しくAMOUNTが1つ選択され、正しく更新されます。
一方、【1】は単なる「副問い合わせ」であり、副問い合わせの中のSALARYは更新対象となるSALARYとは別のテーブルと見なされています。
だから複数行が返ってエラーになります。
(おそらくこのケースではJOINを使った書き換えはできないのでは)
jamshid6さん、回答ありがとうございました。
ご指摘のとおりでした。
相関副問い合わせというんですね。
これから勉強してきます。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT文内での条件分岐
-
SQLで漢字名称を都道府県や市区...
-
このSQLあってますか?教えてく...
-
SQLPLUSのGROUP BY句について
-
サブクエリを使用せずにLEFT JO...
-
SQL 主キーによる自動的な表の結合
-
更新クエリが実行できず、困っ...
-
グループごとの最高得点者一覧...
-
ACCESS2010 SQL 結合キーにつ...
-
Accessで教えてください。
-
列値の分割の方法
-
3つの表の外部結合
-
Access 出荷管理簿を作りたい...
-
SQLについて教えてください。
-
SQL CASE文に制御について
-
SQL、2つのテーブルで条件一致...
-
sqlplusで表示が変なので、出力...
-
「テーブルに座って……」という...
-
Accessでデータシートに同じデ...
-
外部キーだけのテーブル(主キ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLです。こんな感じですか?あ...
-
うまくいきません教えてくださ...
-
SQLで漢字名称を都道府県や市区...
-
このSQLあってますか?教えてく...
-
第4正規形について
-
SQL CASE文に制御について
-
Access 出荷管理簿を作りたい...
-
グループごとの最高得点者一覧...
-
下記の問合せを行うクエリを、P...
-
access結合クエリを編集可能に
-
下記の問合せを行うクエリを、P...
-
select文のサマリー
-
SELECT文内での条件分岐
-
ACCESS2010 SQL 結合キーにつ...
-
accessで在庫管理
-
相関サブクエリの中で、グルー...
-
update文におけるwhereとjoinの...
-
3つの表の外部結合
-
サブクエリを使用せずにLEFT JO...
-
「テーブルに座って……」という...
おすすめ情報