Вернуть таблицу значений путем фильтрации тех, кто никогда не был назначен другому - PullRequest
0 голосов
/ 06 марта 2019

Быстрый вопрос здесь.У меня есть БД с несколькими таблицами, немного, но они связаны ссылочными ключами.Вот моя проблема:

  • Верните 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, он удалит только то, чему научили Velvet и Moise.Не все из них.Я хочу показать только тех, кого не учили эти 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

Моисе не имеет зарегистрированных курсов.Но у Velvet есть 2. MGT1130 и POU3333.Дело в том, что немногие другие учителя тоже имеют такие курсы.Поэтому, почему мне нужно найти способ, чтобы это выглядело так:

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

Я знаю, что мне не хватает мелочи, но я не могу ее найти: (

1 Ответ

1 голос
/ 06 марта 2019

Решение @ 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')
 ) 
...