開発時に発生するエラー
ORA-01427: 単一行副問合せにより2つ以上の行が戻されます
スカラー副問い合わせ(単一行副問合せ)のクエリーの抽出結果がスカラー(単一行)であることが
要求されている箇所にも関わらず結果が複数行戻されている。
原因
ORA-01427: 〜エラーの多くのケースが条件述語において col = (select col .. from ...) といった条件を使用している場合に発生する。
スカラー副問合せを条件述語において使用して副問い合せで 外部結合 を使用しているときにケアレスミスする傾向が高い気がする。
対応(結果行をすべて評価する)
あまりお勧めできない対応方法
スカラー副問合せ col = (select col .. from ...) を IN や ANY による副問合せに変更する。つまり col IN (select col .. from ...) といった条件にする。
対応(重複行を削除する)
あらかじめ同じ結果行が複数戻されることが想定されている場合には DISTINCT で重複行を削除することが簡単で理解しやすいであろう。
しかし、DISTINCT は本来不要なソート処理などが実行されるので副問い合せ内に ROWNUM <= 1 を使用する方が効率が良い。
対応(EXISTS 句について再考する)
主問合せと副問合せに相関がある場合には EXISTS による相関副問合せと IN による相関副問合せのどちらが良いかを再検討する。
EXISTS は主問合せから呼び出され、セミ結合により相関副問合せに該当する行を見つけたところで即座に処理を戻す。
⇒ IN か EXISTS か? 処理とパフォーマンスの違いについて
選択リストのスカラー副問合せ式
条件述語以外にも SELECT の選択リストにスカラー副問合せ(=スカラー副問合せ式)が記述できるようになっているため ORA-01427: 〜エラーとなることもある。
但し、以下の例では ACCOUNT テーブルに複数行のデータが存在する場合に限る。
SQL> SELECT 1, (SELECT USER_NAME FROM ACCOUNT) FROM DUAL;
SELECT 1, (SELECT USER_NAME FROM ACCOUNT) FROM DUAL
*
行1でエラーが発生しました。:
ORA-01427: 単一行副問合せにより2つ以上の行が戻されます
このスカラー副問合せ式(※) は Oracle 9i 以前でも一部で利用できたりする事実があるものの
スカラー副問合せ式が使用できることが明記されているのは Oracle 9i 以降。
そのため Oracle 8i 以前では使用を控えるか、使用したい場合には個別にサポートに問い合わせて公式にサポートされている機能か確認しておいた方がよいだろう。
(新機能がサポート開始以前のバージョンから「実装」されていたのか・・・ということに気付く事は珍しくない)
(※) スカラー副問合せは Oracle 8i 以前でも使用できる。
一覧ページへ戻る
OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。