Это добыта из самообучения класса DB SQL викторинах Stanford Coursera:разницы между социальной сетью запросами
Студентов в вашем родном городе средней школы решили организовать их социальной сети с использованием баз данных. До сих пор они собрали информацию о шестнадцати учениках в четырех классах, 9-12. Вот схема:
Highschooler (ID, name, grade)
Английский: Существует старшеклассник с уникальным идентификатором и заданной имени в определенном классе.
Friend (ID1, ID2)
English: Студент с ID1 дружит со студентом с ID2. Дружба взаимная, поэтому, если (123, 456) находится в таблице друзей, то есть (456, 123).
Likes (ID1, ID2)
English: Студент с ID1 любит студента с ID2. Liking кто-то не обязательно взаимно, поэтому, если (123, 456) находится в таблице Likes , нет никакой гарантии, что (456, 123) также присутствует.
Database here
Подсказка: Для каждого студента, который любит студенческую B, где два не являются друзьями, найти, если они есть друг C общего (кто может представить их!). Для всех таких троек, возвращает имя и класс A, B и C.
У меня есть запрос, который генерирует правильные результаты, и один, который генерирует неправильные результаты, но я не могу логически понять, почему ниже запрос неверен. Я выделил проблему, вызывающую строку, но мне трудно понять ее, и я бы оценил краткий обзор кода.
Работа запроса в связи с пунктом and b.id not in (select id2 from friend where a.id=id1)
:
select distinct a.name, a.grade, b.name, b.grade, c.name, c.grade
from highschooler a, highschooler b, highschooler c, likes, friend
where a.id=likes.id1
and b.id=likes.id2
and a.id=friend.id1
-- this next line
and b.id not in (select id2 from friend where a.id=id1)
and b.id in (select id1 from friend where id2=c.id)
and a.id in (select id1 from friend where id2=c.id)
Некорректный запрос в связи с пунктом and b.id <>friend.id2
:
select distinct a.name, a.grade, b.name, b.grade, c.name, c.grade
from highschooler a, highschooler b, highschooler c, likes, friend
where a.id=likes.id1
and b.id=likes.id2
and a.id=friend.id1
-- as opposed to this one
and b.id <>friend.id2
and b.id in (select id1 from friend where id2=c.id)
and a.id in (select id1 from friend where id2=c.id)
Запроса 1 результат:
Andrew 10 Cassandra 9 Габриэля 9
Austin 11 Jordan 12 Andrew 10
Остин 11 Иордания 12 Kyle 12
Запрос 2 результат:
Andrew 10 Cassandra 9 Gabriel 9
Бретань 10 Kris 10 Haley 10
Austin 11 Jordan 12 Andrew 10
Austin 11 Jordan 12 Kyle 12
Gabriel 11 Alexis 11 Jessica 11
Пожалуйста, добавьте исходные записи для каждой таблицы или настройте http://sqlfiddle.com. Я попытался найти базу данных по URL-адресу, но я не пройду он-лайн курс, чтобы получить его. –