注文のあるユーザー全員を出したいのに 1 人しか出ない。このSQLへの指摘として正しいものは?
SELECT nameFROM usersWHERE id = (SELECT user_id FROM orders)ORDER BY name;正答
- サブクエリに DISTINCT が無いので重複した user_id がまとめられています。SELECT DISTINCT user_id にしましょう。
- 複数行を返すサブクエリを = で比べています。WHERE id IN (SELECT user_id FROM orders) にしましょう。
- ORDER BY name が結果を先頭 1 行に絞っているので、ORDER BY を外す必要があります。
- FROM の中で使うサブクエリには別名が必要なので、AS t を付けないと正しく動きません。
解説
= の右側のサブクエリは 1 行 1 列を返す前提(スカラサブクエリ)で、複数の user_id が返ると意図どおりに動かない。SQLite は先頭の 1 行だけを使うので 1 人しか出ず、PostgreSQL などではエラーになる。複数の値のどれかに一致させるには IN を使う。DISTINCT を付けても複数行のままなので解決しない。別名が必要なのは FROM 句に置くサブクエリで、WHERE の中では要らない。
参考: www.sqlite.org
この問題を含む SQL のテストを制限時間つきで解く
SQLクイズへ