支払済(status = 'paid')の注文があるユーザーだけに絞りたい。正しく直したものは?
SELECT name FROM users uWHERE EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id);正答
- SELECT name FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.status = 'paid');
- SELECT name FROM users u AND o.status = 'paid' WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
- SELECT name FROM users u WHERE EXISTS (SELECT 1 FROM orders o AND o.status = 'paid' WHERE o.user_id = u.id);
- SELECT name FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id) AND o.status = 'paid';
解説
EXISTS は括弧内のサブクエリが 1 行でも返すかを判定する。「支払済の注文がある」と言うには、サブクエリの WHERE に o.user_id = u.id と一緒に o.status = 'paid' を書き、両方を満たす注文の存在を確かめる。括弧の外に AND で書くと、別名 o はサブクエリの外では見えないためエラーになる。FROM の直後に AND を置くのは WHERE より前なので構文エラー。
参考: www.sqlite.org
この問題を含む SQL のテストを制限時間つきで解く
SQLクイズへ