注文の無いユーザーを出したい。このSQLへの指摘として正しいものは?
SELECT * FROM usersWHERE id NOT IN (SELECT user_id FROM orders);正答
- IN の中のサブクエリには AS で別名を付けないとエラーになる
- SQLite では NOT IN が使えないので NOT EXISTS に書き換える
- user_id に NULL があると 1 行も返らない。除外するか NOT EXISTS にする
- IN のサブクエリは 1 行しか返せないので、注文が複数あるとエラーになる
解説
x NOT IN (1, NULL) は「x <> 1 かつ x <> NULL」と同じで、後半が NULL になるため全体が真にならない。user_id が NULL の注文(ゲスト購入など)が 1 件でもあると結果が空になる。WHERE user_id IS NOT NULL を足すか、NOT EXISTS で書くと安全。NOT IN は SQLite でも使え、IN のサブクエリは複数行を返してよいので 2・4 番目は誤り。
参考: www.sqlite.org
この問題を含む 指摘・レビュー のテストを制限時間つきで解く
指摘・レビュークイズへ