我想得到沒有選過任何課程的學生,他們都是由杰伊教的。從下面的表格來看,所有的學生至少有一門課程是由Jay教授的。因此,該查詢需要回傳空。
學生
。| student_id | 姓名
|---|
| s001 | Phil
講師
| 講課者_id | 名稱 |
|---|---|
| t001 | Jay
課程
| 課程_id | 名稱 | 講師_id
|---|---|
| c001 | 數學t001
注冊
| student_id | course_id|
|---|---|
| s001 | c001 |
我的查詢
SELECT s.*
FROM student AS s.
JOIN enroll AS e ON s.student_id = e.student_id
WHERE e.course_id NOT IN ( "c001")
我得到的是什么
我所期望的
我所期望的是什么?
我希望它能回傳空記錄,因為Phil (s001)已經選了一門由Jay教授的課程。 因為他有兩門課程,而這兩門課程的主講人是Gloria,所以它就回傳Phil。我不知道如何從一組類似的記錄(相同的student_id,不同的course_id)中檢查出與某個course_id匹配的記錄。
CodePudding
你的查詢問的是哪些學生除了'c001'之外還有課程,這是一個不同的問題。 相反,考慮到集合,我想看到所有的學生,除了上過'c001'課程的學生:select name
from student
where student_id not in (
select student_id from enroll where course_id = 'c001'
)
我在db-fiddle.com為你創建了運行該查詢所需的最小模式。
下一步是用一個關于講師姓名的條件來替換內部查詢(未經測驗):
select student_id
from lecturer
加入課程 使用(講師_id)。
join enroll using (course_id)
where lecturer.name = ' Jay'
uj5u.com熱心網友回復:
將group_by student_id,并選擇那些having a positive value for not enrolled in "c001"
select s. *。sum(case when course_id in ( "c001") then 1 else 0 end) = 0 not_jay
from student s join enroll e on e.student_id = s.student_id
group by s.student_id
having not_jay >/span> 0
;
詳細的sql fiddle here
uj5u.com熱心網友回復:
使用left join和subquery
select s.*
from student s
left join (
select e.student_id, c.course_id, c.name cname, l.stackurer_id, l.name lname
from enroll e
加入課程c on e.course_id = c.course_id
join lecturer l on c.collecturer_id = l.collecturer_id
where l.name = 'Jay'on s.student_id = ecl.student_id
where ecl.student_id is null
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/334004.html
標籤:
上一篇:從鏈接表中獲取MIN,MAX值
