注文の無いユーザーも出したいのに出ない。このSQLへの指摘として正しいものは?
SELECT u.name, o.amountFROM users uLEFT JOIN orders oWHERE u.id = o.user_idORDER BY u.name;正答
- 結合条件を WHERE に書いているので NULL の行が消えます。LEFT JOIN orders o ON u.id = o.user_id にしましょう。
- LEFT JOIN では注文の無いユーザーは出せないので、RIGHT JOIN に変える必要があります。
- ORDER BY u.name が並べ替えのときに NULL の行を除外しているので、ORDER BY を外す必要があります。
- o.amount が NULL の行は出力されないので、SELECT 句の o.amount を COALESCE(o.amount, 0) で囲む必要があります。
解説
結合条件を WHERE に書くと、LEFT JOIN で右側が NULL になった行は u.id = NULL の比較が偽になって結果から消え、実質 INNER JOIN と同じになる。結合条件は LEFT JOIN orders o ON u.id = o.user_id と ON に書く。RIGHT JOIN に変えると残る側が orders になり逆効果。COALESCE は表示する値を置き換えるだけで、消えた行は戻らない。SQLite は ON の無い LEFT JOIN も通すのでエラーで気づけない。
参考: www.sqlite.org
この問題を含む SQL のテストを制限時間つきで解く
SQLクイズへ