我正在做數據庫課程的斯坦福德簡介,這是家庭作業之一。我的代碼做這項工作很好,但我真的不喜歡它,我如何重複使用相同的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