2017-02-11 1 views
0

У меня эти две таблицы: Предпосылки: (cid, pre-cid) (запись: sid, cid, qtr, year, grade).SQL: Поиск студентов, которые выполняют курс prerequsite

Я должен найти студентов, которые выполняют предпосылки для определенного класса, используя только НЕ ВХОД. Мой текущий запрос:

select distinct sid 
from record 
where sid not in (
     select s.sid 
     from record s, 
      prerequisite p 
     where p.cid = "CSE132X" 
      and s.cid <> p.precid 
      and s.grade < 2 
     ); 

Однако мой запрос возвращает студентов, которые приняли какие-либо предпосылки, а не все предпосылки. Мне трудно понять, как сделать так, чтобы он проверял все предпосылки курса.

+0

Выборочные данные наряду с ожидаемым набором результатов поможет уточнить, что вы на самом деле пытаетесь достичь. –

ответ

1
select distinct r.sid 
from record r 
where r.sid not in (
    select r.sid 
    from prerequisite c 
    where c.cid = "CSE132X" and 
    c.pre-cid not in (
      select r2.cid 
      from record r2 
      where r2.sid = r.sid 
    ) 
); 
+0

Да, я знал, что мне нужны два вложенных запроса, но мне очень тяжело было вложить в каждый вложенный запрос. Теперь я понимаю, что должен был делать pre-cid не во вложенном запросе. Спасибо! –

+0

@ L.S. Логика «X = not not X» может быть выражена на английском языке так: «взяла все предпосылки = нет предварительных условий, которые не были приняты». –

0

Что-то вроде этого:

select distinct sid from record y where grade>=2 and not exists(select * from prerequisite where cid='CSE132X' and precid not in (select cid from record x where x.sid=y.sid));

+0

Спасибо, я смог превратить это в запрос, используя только NOT IN и выдающий правильный вывод: выбрать отличный y.sid из записи y где y.rade> = 2 и y.sid не в (выберите s .sid из записи s, предпосылка p, где p.cid = "CSE132X" и p.precid не в (выберите x.cid из записи x, где x.sid = y.sid)); –