Я делаю введение Stanfords в курс DB, и это одно из домашних заданий. Мой код делает работу хорошо, но мне не очень нравится, как я повторно тот же Select-FROM-РЕГИСТРИРУЙТЕСЬ часть дважды:Есть ли более элегантный способ написания этого SQL-запроса?
SELECT name, grade
FROM Highschooler
WHERE
ID IN (
SELECT H1.ID
FROM Friend
JOIN Highschooler AS H1
ON Friend.ID1 = H1.ID
JOIN Highschooler AS H2
ON Friend.ID2 = H2.ID
WHERE H1.grade = H2.grade
) AND
ID NOT IN (
SELECT H1.ID
FROM Friend
JOIN Highschooler AS H1
ON Friend.ID1 = H1.ID
JOIN Highschooler AS H2
ON Friend.ID2 = H2.ID
WHERE H1.grade <> H2.grade
)
ORDER BY grade, name
Это SQL схемы для двух таблиц, используемых в коде:
Highschooler(ID int, name text, grade int);
Friend(ID1 int, ID2 int);
Мне пришлось запросить у всех старшеклассников, у которых есть друзья только в одном классе, а не в других классах. Есть ли способ как-то написать код ниже один раз и повторно использовать его два раза для двух разных предложений WHERE = и <>?
SELECT H1.ID
FROM Friend
JOIN Highschooler AS H1
ON Friend.ID1 = H1.ID
JOIN Highschooler AS H2
ON Friend.ID2 = H2.ID
EDIT: Мы должны обеспечить SQLite код.
+1 да, это, вероятно, лучшее предложение, поскольку оно правильно использует всю информацию, которую мы имеем о данных, которые хотели бы вернуть, и делает это на одном уровне запроса. – quetzalcoatl
Прошу прощения, но я не понимаю, как я могу использовать/использовать ваш код. Я пробовал различные варианты, и никто из них не вернул правильные записи. – pootzko