SQL-запрос для поиска пар, не имеющих общих значений

#database

#База данных

Вопрос:

У меня есть таблица, в которой есть столбцы Person и the Food of liking. Таблица выглядит следующим образом.

 |----------|--------|
|   Person |Food    |
|----------|--------|
|   Sam    |Fish    |
|   Sam    |Taco    |
|   Alexis |Taco    |
|   Alexis |Pizza   |
|   Robert |Sushi   |
|   Robert |Chicken |
|----------|--------|
  

Я хочу пару людей, у которых нет общей еды. Вывод должен быть

 |--------|--------|
|  Sam   | Robert |
| Alexis | Robert |
|--------|--------|
  

Я новичок в SQL. Может ли кто-нибудь указать мне правильное направление

Комментарии:

1. Это похоже на домашнее задание. Так ли это?

Ответ №1:

Хммм … создайте пары, а затем проверьте, нет ли общего питания:

 select p1.person, p2.person
from (select distinct person from liking) p1 join
     (select distinct person from liking) p2 
     on p1.person = p2.person left join
     liking l1
     on l1.person = p1.person left join
     liking l2
     on l2.person = p2.person and l2.food = l1.food
where l2.person is null

 
  

Ответ №2:

 if object_id('tempdb..#liking') is not null
    drop table #liking
create table #liking (person varchar(20), food varchar(20))
insert into #liking values ('Sam'   ,'fish'), ('sam', 'taco'), ('alexis' , 'taco'), ('alexis' , 'pizza'), ('robert', 'sushi'), ('robert','chicken')

select p1.person, p2.person, max(case when l1.food = l2.food then 1 else 0 end)
    from (select distinct person from #liking) p1 
cross join (select distinct person from #liking) p2 
left join #liking l1
    on l1.person = p1.person 
left join #liking l2
    on l2.person = p2.person
where p1.person>p2.person
group by p1.person, p2.person
having max(case when l1.food = l2.food then 1 else 0 end) = 0
  

Комментарии:

1. Было бы неплохо, если бы вы предоставили некоторое описание вашего решения.

2. Извините, что пропустил объяснение.

3. Объяснение: перекрестное объединение всех комбинаций, используйте оператор case для сравнения продуктов, сгруппированных по каждой паре людей. Добавьте сравнение p1.person> p2.person, чтобы избежать дублирования в парах x, y против y, x, что означает то же самое для этой проблемы. Наконец, используйте «having» для фильтрации только тогда, когда оператор case возвращает 0 (нет подходящего питания для пары).