通过过滤那些从未分配给其他人的返回值表

时间:2019-03-06 01:12:34

标签: sql database oracle sqlplus

这里的快速问题。我有一个数据库,其中有几个表,但不多,但它们与参考键链接。这是我的问题:

  • 退回sigil尚未由名称为'Velvet' , 'Moise'的老师讲授的课程

我可以轻松地编写请求,但似乎找不到正确的逻辑。

这是我尝试过的:

SELECT g.sigil
FROM   GroupCourse g JOIN Professor p
       ON g.profCode = p.profCode
WHERE  p.name != 'Velvet' AND p.name != 'Moise'

它的工作原理与应该的一样,但是如果我也有其他老师在教这门课程,比如说TRX1277,它只会删除VelvetMoise所教的课程。不是所有的人。我只想显示那些没有被那些2教过的人。

表定义:

GroupCourse

  • Primary keys : sigil, codeSession
  • sigil: CHAR
  • noGroup : INTEGER
  • sessionCode: INTEGER
  • profCode: CHAR

教授

  • Primary key : profCode
  • profCode: VARCHAR
  • firstName: VARCHAR
  • lastName: VARCHAR

此刻,我得到了:

-------
SIGIL
-------
MGT1130
JPR6790
TRX1277
POU3333

Moise没有注册课程。但是Velvet有2。MGT1130和POU3333。问题是,很少有其他老师也有那些课程。因此,为什么我需要找到一种使其看起来像这样的方法:

-------
SIGIL
-------
JPR6790
TRX1277    

我知道我想念一件事,但我找不到它((

1 个答案:

答案 0 :(得分:1)

@ fa06的解决方案很接近,但是排除了教授教授的行,而不是任何一位教授从未教过的课程。

SELECT g.sigil
FROM   GroupCourse g 
WHERE  not exists (
     select 1 
     FROM   GroupCourse g1 
     JOIN   Professor p ON g1.profCode = p.profCode 
     where  g.sigil=g1.sigil 
     and    p.name in('Velvet','Moise')
 )