我正在尝试选择没有作业11分的学生,并返回他们的名字。这是我的桌子和尝试解决方案..每个选择单独工作但不在一起。
CREATE TABLE Student(
Student_ID INT,
Student_Name VARCHAR(10)
)
INSERT INTO Student (Student_ID, Student_Name) VALUES (1,'Alex'),(2, 'Brett1'),(3,'Cora'),(4,'David'),(5,'Eleanor'),(6,'Brett2')
CREATE TABLE Grades(
Student_ID INT,
Assignment_ID INT,
Grade INT
)
INSERT INTO Grades (Student_ID, Assignment_ID, Grade) VALUES (1,10,90),(2,10,85),(3,10,75),(4,10,74),(1,11,80),(2,11,81),(4,11,88),(6,11,86),(2,12,84)`
SELECT *
FROM Student s
LEFT OUTER JOIN Grades g on s.Student_ID=g.Student_ID
WHERE g.Student_ID NOT IN(
SELECT * FROM Grades g
WHERE g.Assignment_ID = 11
)
答案 0 :(得分:1)
我会在这里使用带有相关子查询的NOT EXISTS。
select *
from Student s
where not exists
(
select *
from Grades g
where g.Student_ID = s.Student_ID
AND g.Assignment_ID = 11
)
答案 1 :(得分:0)
你是那里的人:
SELECT Student_ID
FROM Student s
WHERE g.Student_ID NOT IN(
SELECT Student_ID FROM Grades g
WHERE g.Assignment_ID = 11
AND Student_ID IS NOT NULL)
答案 2 :(得分:0)
SELECT Student_Name FROM Student AS s
LEFT JOIN Grades AS g
ON s.Student_ID = g.Student_ID AND g.Assignment_ID = 11
WHERE g.Grade IS NULL
请注意,如果这些是非常大的表,与@SeanLange的答案相比,上面会有很小的性能影响,如果所有索引都在每个非常大的情况下正确设置,那么它可能会执行得更快一点表:
SELECT Student_Name FROM Student s
WHERE NOT EXISTS
(
SELECT * FROM Grades g
WHERE g.Student_ID = s.Student_ID AND g.Assignment_ID = 11
)
答案 3 :(得分:0)
您可以使用以下查询:
;with cte (stId,asgId) as
(
select s.Student_ID as stId ,g.Assignment_Id as asgId
from Student s
inner join Grades g on s.Student_Id = g.Student_ID
where g.Assignment_Id = 11
)
select distinct Student_Name
from Student s
where s.Student_ID not in (select stId from cte)
答案 4 :(得分:0)
我喜欢Sean Lange的答案,但您也可以使用子查询和LEFT JOIN:
SELECT s.student_name
FROM student s
LEFT JOIN
(SELECT student_id
FROM grades
WHERE assignment_id = 11) sub
ON s.student_id = sub.student_id
WHERE sub.student_id IS NULL