副問合せ(サブクエリ)をWHERE句やHAVING句で使った際、「比較できません」「単一行サブクエリで複数行が返りました」などのエラーに遭遇することがあります。
この記事では、比較できないケースの原因と、正しく比較するための対処方法をわかりやすくまとめます。
副問合せが比較できない典型的なケース一覧
| ケース | 内容 | 原因 | 対処方法 |
|---|---|---|---|
| = や 、>、< が使用できない | サブクエリが複数行を返す | スカラー比較は1件のみ有効 | IN / NOT IN、MAX MIN ROWNUM を使う |
| IN で比較しているが結果が一致しない | 値に NULL が含まれている | NULL比較は3値論理 | NVL()/COALESCE()でNULLを除外 |
| NOT IN 使用時に意図しない結果 | NULLを含むと全部FALSE扱いになる | SQLのNULLの仕様 | NOT EXISTSに変更 |
| サブクエリにORDER BYを記述 | ORDER BYは単一行のスカラーサブクエリでのみ有効 | 複数行の場合無効 | メインクエリ側で並び替え |
| HAVING句で直接比較 | 集計後の結果と未集計の値比較 | 集計粒度が異なる | JOINまたは別CTE化する |
エラー例:単一行サブクエリが複数行を返す
❌ 発生するエラー
✔ 対処方法1:IN を使用
✔ 対処方法2:MAX で1行に絞る
NULLが含まれる場合の問題:NOT INの落とし穴
❌ サブクエリ側にNULLが含まれると、結果は0件
理由:NOT IN の条件式が NULL を含むと UNKNOWN評価になるため
✔ 正しい対処方法:NOT EXISTS
複数項目比較ができないケース
✔ 対処方法:JOINで解決
まとめ
副問合せで比較できない主な原因は以下の通りです:
-
サブクエリが複数行を返している
-
NULLが含まれている
-
比較対象の粒度が異なる
-
NOT INはNULLで失敗することがある
正しい選択の目安
| やりたいこと | 推奨構文 |
|---|---|
| 複数行比較 | IN / EXISTS |
| 除外比較(NULLを考慮したい) | NOT EXISTS |
| 最大値/最新のみ取得 | MAX / ROWNUM / FETCH FIRST 1 ROW |
| 複数列の条件比較 | JOIN |
