我有一个简单的" registration "表,其中包含已注册课程的学生。一个学生可以注册多门课程。
我想查找所有注册了课程1234但没有注册课程5678的学生.
所以我尝试了这个尝试:
SELECT ?student_id
WHERE {
?registration :R-Student_id ?student_id ;
:R-Course_code ?course_code .
FILTER(?course_code = "1234") .
FILTER NOT EXISTS {
?registration :R-Course_code "5678" .
}
}
ORDER BY ?student_id
但是似乎最后一个FILTER NOT EXISTS
对查询没有影响?我仍然可以从查询结果中找到同样注册了第二门课程的student_id:/
我在这里做错了什么?
所以我设法解决它使用某种"self join";
SELECT ?student_id
WHERE {
?r1 :R-Student_id ?student_id ;
:R-Course_code "1234" .
FILTER NOT EXISTS {
?r2 :R-Student_id ?student_id ;
:R-Course_code "5678" .
}
}
ORDER BY ?student_id