SQL4 択難易度 応用

注文のあるユーザー全員を出したいのに 1 人しか出ない。このSQLへの指摘として正しいものは?

SELECT nameFROM usersWHERE id = (SELECT user_id FROM orders)ORDER BY name;

正答

  1. サブクエリに DISTINCT が無いので重複した user_id がまとめられています。SELECT DISTINCT user_id にしましょう。
  2. 複数行を返すサブクエリを = で比べています。WHERE id IN (SELECT user_id FROM orders) にしましょう。
  3. ORDER BY name が結果を先頭 1 行に絞っているので、ORDER BY を外す必要があります。
  4. FROM の中で使うサブクエリには別名が必要なので、AS t を付けないと正しく動きません。

解説

= の右側のサブクエリは 1 行 1 列を返す前提(スカラサブクエリ)で、複数の user_id が返ると意図どおりに動かない。SQLite は先頭の 1 行だけを使うので 1 人しか出ず、PostgreSQL などではエラーになる。複数の値のどれかに一致させるには IN を使う。DISTINCT を付けても複数行のままなので解決しない。別名が必要なのは FROM 句に置くサブクエリで、WHERE の中では要らない。

参考: www.sqlite.org

subqueryin

この問題を含む SQL のテストを制限時間つきで解く

SQLクイズへ