Oracle を使った SQL 開発や運用の現場で、次のようなエラーに遭遇したことはないでしょうか。
|
1 |
ORA-01427: 単一行副問合せにより2つ以上の行が戻されます |
このエラーは 「1行だけ返るはずの副問合せ(サブクエリ)が、実際には複数行を返してしまった」 場合に発生します。
SQL の書き方自体は正しそうに見えるため、原因が分かりにくいのが特徴です。
本記事では、
- ORA-01427 エラーの意味
-
発生する典型パターン
-
実務で使える修正方法
を SQL例付き で分かりやすく解説します。
ORA-01427 エラーとは?
ORA-01427 は、単一行副問合せ(Single-row Subquery) が
2行以上の結果を返した場合 に発生する Oracle エラーです。
単一行副問合せとは?
次のように「結果が1行だけ返ることを前提」にした副問合せを指します。
|
1 2 3 4 5 6 7 |
SELECT * FROM employees WHERE department_id = ( SELECT department_id FROM departments WHERE department_name = 'SALES' ); |
この = の右側にある副問合せは、1行しか返らない ことが前提です。
ORA-01427 が発生する原因
原因① 副問合せが複数行を返している
最も多い原因です。
location_id = 100 に該当する部署が 複数存在する場合、
副問合せは複数行を返し、ORA-01427 が発生します。
原因② ユニークだと思っていた条件が実は重複している
業務データでは「本来1件のはず」が崩れているケースがよくあります。
-
email が一意制約されていない
-
データ不整合がある
このような場合、副問合せが複数行になります。
原因③ UPDATE / INSERT / SELECT INTO での副問合せ
以下のような SQL でも頻発します。
status = 'ACTIVE' の顧客が複数いると、即 ORA-01427 です。
ORA-01427 の代表的な修正方法
修正方法① IN を使う(複数行を許容する)
複数行が返ること自体が正しい場合は、= を IN に変更します。
👉 最もシンプルかつ安全な修正方法
修正方法② 集約関数で1行に絞る
「どれか1件で良い」場合は集約関数を使います。
※ ビジネスロジック的に問題ないかは要確認
修正方法③ ROWNUM で1件に制限する
👉 「とりあえず1件」にしたい場合の応急処置として使われがち
修正方法④ EXISTS を使う(相関副問合せ)
-
複数行でも問題なし
-
パフォーマンスが良いケースも多い
実務では IN より EXISTS が推奨 されることもあります。
ORA-01427 を防ぐための設計ポイント
-
=を使う副問合せは 必ず1行になることを確認 -
業務上複数行になり得るなら
IN/EXISTSを使う -
「本来1件」のデータは 一意制約(UNIQUE)を検討
-
UPDATE / INSERT の副問合せは特に注意
まとめ
-
ORA-01427 は 単一行副問合せが複数行を返した時のエラー
-
原因の多くは 条件の想定ミス or データ不整合
-
修正方法は主に以下
-
INに変更 -
集約関数で1行化
-
ROWNUMで制限 -
EXISTSを使う
-
ORA-01427 は Oracle 初心者〜中級者が必ず一度は踏むエラー です。
本記事のパターンを押さえておけば、今後は即対応できるようになります。

