#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 (нет подходящего питания для пары).