結合された 2 つのテーブルがあります。
AにはBがたくさんある
通常、次のようにします。
select * from a,b where b.a_id = a.id
b にレコードがある a からすべてのレコードを取得します。
b に何もない a のレコードだけを取得するにはどうすればよいですか?
select * from a where id not in (select a_id from b)
または、このスレッドの他の人が言うように:
select a.* from a
left outer join b on a.id = b.a_id
where b.a_id is null
select * from a
left outer join b on a.id = b.a_id
where b.a_id is null
別のアプローチ:
select * from a where not exists (select * from b where b.a_id = a.id)
"exists" アプローチは、内部クエリに付加する必要がある他の "where" 句がある場合に便利です。
SELECT id FROM a
EXCEPT
SELECT a_id FROM b;
外部結合を使用すると、('not in' を使用するよりも) パフォーマンスが大幅に向上する可能性があります。
select * from a left outer join b on a.id = b.a_id where b.a_id is null;
SELECT <columnns>
FROM a WHERE id NOT IN (SELECT a_id FROM b)
別の書き方
select a.*
from a
left outer join b
on a.id = b.id
where b.id is null
痛い、ネイサンに殴られた:)
これにより、予期しない動作を引き起こす可能性のある IN 句の null から保護されます。
select * from a where id not in (select [a id] from b where [a id] is not null )