SQL选择帮助 - 子查询

时间:2018-02-07 15:52:23

标签: sql sql-server

我正在尝试选择没有作业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
    )

5 个答案:

答案 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

enter image description here

请注意,如果这些是非常大的表,与@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