2015-11-21 2 views
0

У меня есть база примеров, где я храню отношения между мужчинами и женщинами. Схема и некоторые данные показаны на изображении.Выберите из данных таблицы A, без соответствия таблице B

enter image description here

Есть ли способ выбрать все человек, которые не находятся в БФФ отношений? Например, ответ будет Боб, Чарли и Ник.

Я думаю, что на самом деле я выбираю данные из таблицы без данных из таблицы B (с некоторым условием). Есть ли способ достичь этого?

+0

Как этот вопрос слишком широк? Я думаю, что это очень специфично. Дублируйте уверенно, но не слишком широко. –

ответ

2

Вопрос данного типа предлагает not exists. Хитрость в том, что not exists подзапрос имеет присоединиться:

select m.* 
from man m 
where not exists (select 1 
        from man_women_relationship mwr join 
         type t 
         on mwr.fk_type = t.id 
        where mrw.fk_man = m.id and t.name = 'BFF' 
       ); 
+0

Это работает, спасибо :) Но грустно, что вопрос для этого запроса не существует. – Bullman

1

Я новичок в SQL, так что я могу ошибаться. Но это то, что я хотел бы попробовать:

выберите имя из Man_Women_Relationship присоединиться Тип на Man_Women_Relationship.FK_Type = Type.ID И Type.ID = 4

+1

Извините, это было для людей, которые ARE в отношениях BFF, поэтому я думаю, вам придется делать то, что не существует, как Гордон сделал выше. – Logan

1

подзапросов может быть медленным и трудно читать. Вы можете использовать внешнее соединение, чтобы избежать использования подзапроса:

SELECT Man.* 
FROM Man 
JOIN Man_Woman_Relationship mwr ON Man.ID = mwr.FK_Man 
LEFT JOIN Type ON mwr.FK_Type = Type.ID AND Type.Name = 'BFF' 
WHERE Type.Name IS NULL 

Это поможет вам все людям, которые находятся в отношениях, но не в отношениях БФФ. Для того чтобы включить людей, которые не находятся в любых отношениях, вы должны LEFT JOIN таблицу отношений, а также:

SELECT Man.* 
FROM Man 
LEFT JOIN Man_Woman_Relationship mwr ON Man.ID = mwr.FK_Man 
LEFT JOIN Type ON mwr.FK_Type = Type.ID AND Type.Name = 'BFF' 
WHERE Type.Name IS NULL 
+0

Спасибо за ответ, но я не думаю, что это должно работать, @Gordons ответ исправил мою проблему :) – Bullman

+0

Вы не думаете, что это работает? Ты это пробовал? –

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