「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

Oracle を使った SQL 開発や運用の現場で、次のようなエラーに遭遇したことはないでしょうか。

このエラーは 「1行だけ返るはずの副問合せ(サブクエリ)が、実際には複数行を返してしまった」 場合に発生します。
SQL の書き方自体は正しそうに見えるため、原因が分かりにくいのが特徴です。

本記事では、

  • ORA-01427 エラーの意味
  • 発生する典型パターン

  • 実務で使える修正方法
    SQL例付き で分かりやすく解説します。

ORA-01427: 単一行副問合せにより2つ以上の行が戻されます


ORA-01427 エラーとは?

ORA-01427 は、単一行副問合せ(Single-row Subquery)
2行以上の結果を返した場合 に発生する Oracle エラーです。

単一行副問合せとは?

次のように「結果が1行だけ返ることを前提」にした副問合せを指します。

この = の右側にある副問合せは、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 初心者〜中級者が必ず一度は踏むエラー です。
本記事のパターンを押さえておけば、今後は即対応できるようになります。

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る

Ads by Google

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
0
あなたの考えが大好きです、コメントしてください。x