ユーザー名と注文金額を正しく対応づけたい。直したものは?
SELECT u.name, o.amount FROM users uJOIN orders o ON u.id = o.id ORDER BY o.id;正答
- SELECT u.name, o.amount FROM users u JOIN orders o USING (id) ORDER BY o.id;
- SELECT u.name, o.amount FROM users u JOIN orders o ON u.id = o.user_id ORDER BY o.id;
- SELECT u.name, o.amount FROM users u JOIN orders o ON u.name = o.user_id ORDER BY o.id;
- SELECT u.name, o.amount FROM users u JOIN orders o ON u.id = o.id WHERE o.user_id = u.id ORDER BY o.id;
解説
orders の id は注文自身の番号で、ユーザーを指すのは外部キーの user_id である。u.id = o.id では「ユーザー番号と注文番号が偶然同じ」行が結合され、無関係な組み合わせが返る。選択肢 1 の USING (id) は両表の id どうしを比べるので修正前と同じ誤り。選択肢 4 は誤った ON に条件を足しただけで、両方を満たす行しか残らない。
参考: www.sqlite.org
この問題を含む SQL のテストを制限時間つきで解く
SQLクイズへ