web-dev-qa-db-ja.com

Oracle:外部キーを持つテーブルで子のない行を見つける?

外部キー関係を持つ2つのテーブルがあるとします。対応する「子」行がない「親」テーブルの行を見つけるにはどうすればよいですか?

例えば:

create table a(x number primary key);
create table b(x number);
alter table b add constraint b_fk foreign key(x) references a(x) enable;

insert into a values(1);
insert into b values(1);
insert into a values(2);
commit;

delete from a where x = 2; -- will succeed
delete from a where x = 1; -- will fail, because there is a child row.

select ??? as "rows with no children" from a;

rows with no children
---------------------
                    2
1
Mark Harrison

サンプルテーブルがないため、これを作成する必要があります。

select * from parent_table
where parent_table.foreign_key_id in
(select parent_table.foreign_key_id
from parent_table
minus
select child_table.id
from child_table)

parent_table.foreign_key_idがchild_table.idと一致する可能性がある場所

3
kevinsky

これを意味的に適切に表現する方法は次のとおりです。

select ...
from   a
where  not exists (
         select null
         from   b
         where  b.x = a.x)

NOT EXISTSは、オプティマイザがテーブルに非常に応答し、カーディナリティを結合できるようにする反準結合を使用します。

4
David Aldridge