2015-09-24 2 views
0

У меня есть две таблицы:проблемы Список в иностранных ключевых отношений

create table FOO (
    id integer primary key 
); 
create table BAR (
    id primary key, 
    fooId integer -- yeah, this *should* be a foreign key 
); 
insert into FOO values (10); 
insert into FOO values (11); -- no BAR 
insert into BAR values (20, 10); -- OK 
insert into BAR values (21, 3); -- No FOO 
insert into BAR values (22, 10); -- duplicates are OK 

По какой-то причине, они не имеют отношения FK, даже если они должны. Когда я создаю отношение, я получаю сообщение об ошибке, потому что некоторые из отношений нарушаются.

Я ищу для запроса SQL в котором перечислены основные ключи обеих таблиц, которые имеют сломанный отношение к другой, т.е. FOO s, которые не используются ни в одном BAR с и BAR s, которые содержат незаконные fooId сек , В примере, запрос должен возвращать:

fooId | barId 
11  NULL 
NULL 21 

ответ

0

Делают UNION ALL с двумя NOT IN-х:

select id, null from FOO where id not in (select fooId from bar where fooId is not null) 
union all 
select null, id from BAR where fooId not in (select id from foo where id is not null) 

Или же FULL OUTER JOIN:

select distinct f.id, b.id 
from foo f 
    full outer join bar b on f.id = b.fooid 
where f.id is null 
    or b.id is null 
0

Вы можете использовать full outer join.

select foo.id as fooid, bar.id as barid 
from foo 
full join bar on foo.id = bar.fooid 
where foo.id is null or bar.id is null 
2

Просто используйте not exists (или not in или left join с пунктом where):

select b.* 
from bar b 
where not exists (select 1 from foo f where f.id = b.fooid); 

Единственные сломанные отношения являются те, где bar.fooid не соответствует действительное foo.id. Наличие значения в foo без соответствующего значения в bar не прерывается.

Но найти foo.id значения, которые не используются в bar, очень похожий запрос может быть использован:

select f.* 
from foo f 
where not exists (select 1 from bar b where f.id = b.fooid); 
+0

Когда 'FOO' является' Custom er' и 'BAR' -' Адрес', то клиенты без адресов также сломаны :-) –

+1

@AaronDigulla. , , Не в смысле базы данных (поскольку ваши таблицы настроены). Вы не получите ошибку в этом случае, когда пытаетесь установить отношение внешнего ключа. –

+0

Я знаю об этом. Но для отчета «пожалуйста, очистите это», мне нужны оба. –

Смежные вопросы