我正在做数据库课程的斯坦福德简介,这是家庭作业之一。我的代码做这项工作很好,但我真的不喜欢它,我如何重复使用相同的SELECT-FROM-JOIN部分两次:是否有写这个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
编辑:我们需要提供SQLite代码。
+1 yep,这可能是最好的建议,因为它正确地利用了我们对于要返回的数据的所有信息,并且它在查询的同一层执行此操作。 – quetzalcoatl 2013-02-10 16:20:12
我很抱歉,但我不明白我如何使用/熟练掌握您的代码。我尝试了它的各种变化,并没有一个返回正确的记录。 – pootzko 2013-02-10 17:14:35