Oracle查询以获取表中的缺失值

时间:2016-03-15 07:11:36

标签: oracle oracle11g

请帮我提供一个获取缺失值的解决方案

表:学生

 Stud_ID    Stud_Name   Subject
 S001        Peter      Mathematics
 S001        Garry      Physics
 S001        Mike       English

 S002        JOhn       Physics
 S002        Nike       English

 S003        Jim        Mathematics

 S004        Kerry      English
 s004        Michel     Mathematics

我需要编写一个oracle查询来获取学生姓名,但他没有这个主题" Physics"

我尝试过查询

SELECT * 
FROM STUDENT 
WHERE SUBJECT NOT IN('Physics')

但它并没有像我预期的那样获取记录。感谢是否有人能提供解决方案。

3 个答案:

答案 0 :(得分:2)

您也可以尝试以下

SELECT stud_Name
FROM STUDENT
WHERE stud_id NOT IN (SELECT stud_id FROM STUDENT WHERE subject='PHYSICS');

答案 1 :(得分:0)

SELECT stud_id FROM student WHERE subject  IN ('Physics')

会给你带有物理学的学生。你不想要他们。所以:

select * 
from students
where stud_id not in (SELECT stud_id FROM student WHERE subject  IN ('Physics'))

答案 2 :(得分:0)

您可以在没有相关子查询的情况下(在单个表扫描中)执行此操作:

SELECT stud_id
FROM   student
GROUP BY stud_id
HAVING COUNT( CASE WHEN subject = 'Physics' THEN 1 END ) = 0;

如果你想获得名单,那么你可以这样做:

SELECT stud_id,
       LISTAGG( stud_name, ',' ) WITHIN GROUP ( ORDER BY stud_name ) AS stud_names
FROM   student
GROUP BY stud_id
HAVING COUNT( CASE WHEN subject = 'Physics' THEN 1 END ) = 0;