用于获取表中缺少的值的Oracle查询

用于获取表中缺少的值的Oracle查询,oracle,oracle11g,Oracle,Oracle11g,请帮助我提供一个解决方案来获取丢失的值 表:学生 Stud_ID Stud_Name Subject S001 Peter Mathematics S001 Garry Physics S001 Mike English S002 JOhn Physics S002 Nike English S003 Jim Mat

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

表:学生

 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查询来获取学生的名字,他没有“物理”科目

我试着问了一个问题

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

但是它没有像我预期的那样获取记录。如果有人能提供解决方案,我们将不胜感激。

您也可以尝试下面的解决方案

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

你也可以试试下面的一个

SELECT stud_Name
FROM STUDENT
WHERE stud_id NOT IN (SELECT stud_id FROM STUDENT WHERE subject='PHYSICS');
会给你一个有物理的学生。你不想要他们。因此:

select * 
from students
where stud_id not in (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'))

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

如果要获取姓名列表,可以执行以下操作:

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;

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

如果要获取姓名列表,可以执行以下操作:

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;

上面的查询仍然会获取stud_id S001和S002,我不想要这个,因为S001和S002有物理记录上面的查询仍然会获取stud_id S001和S002,我不想要这个,因为S001和S002有物理记录stud_id是什么意思?为什么每个学生都可以有很多名字?但是为什么你的名字对我们大喊大叫?Stud_ID是什么意思?为什么每个学生都有很多名字?但是为什么你的名字对我们大喊大叫呢?谢谢大家的建议谢谢大家的建议