76

結合された 2 つのテーブルがあります。

AにはBがたくさんある

通常、次のようにします。

select * from a,b where b.a_id = a.id

b にレコードがある a からすべてのレコードを取得します。

b に何もない a のレコードだけを取得するにはどうすればよいですか?

4

11 に答える 11

118
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
于 2008-09-29T22:57:50.423 に答える
26
select * from a
left outer join b on a.id = b.a_id
where b.a_id is null
于 2008-09-29T23:00:23.617 に答える
6

別のアプローチ:

select * from a where not exists (select * from b where b.a_id = a.id)

"exists" アプローチは、内部クエリに付加す​​る必要がある他の "where" 句がある場合に便利です。

于 2008-09-29T23:01:10.150 に答える
4
SELECT id FROM a
EXCEPT
SELECT a_id FROM b;
于 2012-03-13T10:42:44.707 に答える
2

外部結合を使用すると、('not in' を使用するよりも) パフォーマンスが大幅に向上する可能性があります。

select * from a left outer join b on a.id = b.a_id where b.a_id is null;
于 2008-09-29T23:05:52.527 に答える
1
SELECT <columnns>
FROM a WHERE id NOT IN (SELECT a_id FROM b)
于 2008-09-29T22:57:55.633 に答える
0

別の書き方

select a.*
from a 
left outer join b
on a.id = b.id
where b.id is null

痛い、ネイサンに殴られた:)

于 2008-09-29T23:06:44.537 に答える
0

これにより、予期しない動作を引き起こす可能性のある IN 句の null から保護されます。

select * from a where id not in (select [a id] from b where [a id] is not null )

于 2008-09-29T23:14:45.670 に答える