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

副問合せ(サブクエリ)を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

Ads by Google