以下のようなテーブルを用意してクエリを実行したとき、
「existsは1行でも条件に合致する行を見つけたらそこで検索を打ち切る」
としたら田中か中田のみを検索して、クエリの結果にはどちらか一方しか含まれないと思うのですが、結果は両方含まれています。この矛盾をどう説明したらいいでしょうか。
DROP TABLE IF EXISTS class_a; DROP TABLE IF EXISTS class_b; CREATE TABLE class_a ( id bigserial not NULL, name text ); CREATE TABLE class_b ( id bigserial not NULL, name text ); insert into class_a VALUES (DEFAULT, '田中'); insert into class_a VALUES (1, '中田'); insert into class_a VALUES (DEFAULT, '鈴木'); insert into class_a VALUES (DEFAULT, '伊集院'); insert into class_b VALUES (DEFAULT, '田中'); insert into class_b VALUES (1, '中田'); insert into class_b VALUES (DEFAULT, '鈴木'); insert into class_b VALUES (DEFAULT, '西園寺'); SELECT * FROM class_a; SELECT * FROM class_b;
SELECT id,name from class_a a WHERE EXISTS( SELECT * from class_b b WHERE a.ID = b.ID )
私が考えたのは、
「a.id=b.idのレコードを検索する。id=1の行を検索するとき、中田と田中が該当するが、レコードの順序はないのでどちらかを先に検索できた時点でid=1の検索をやめてid<>1のレコードをけんさくするだろう」
ということです。おそらく間違っていると思うのでどなたか指摘していただければと思います。