2012-10-05 2 views
0

У меня есть следующие таблицыболее простой SQL-запрос

  • студентов (с.и.д., SNAME, возраст)
  • курс (чид, CNAME, продолжительность)
  • Записаться (SID, чид, дата)

Чтобы найти всех sid, кто прошел курсы, которые принял sid = 1.

select sid from enroll where cid in (select cid from enroll where sid=1) 
group by sid having count(*)=(select count(*) from enroll where sid=1) 
minus (select sid from student where sid=1); 
  1. Что делает первый отсчет (*) относится к?
  2. Есть ли более простая версия запроса?
+0

'COUNT (*)' означает сосчитать все строки. –

+0

, который строит? результат 'select cid из регистрации, где sid = 1'? – John

+0

В вашем случае кол-во (*) проверяет сидики с зарегистрированным количеством курсов, равным sid = 1 зарегистрированным подсчетом. –

ответ

0

Первый COUNT(*) относится к количеству строк, принадлежащих определенному sid.

переформатирован:

SELECT sid 
    FROM enroll 
WHERE cid IN (SELECT cid FROM enroll WHERE sid=1) 
GROUP by sid 
HAVING COUNT(*) = (SELECT COUNT(*) FROM enroll WHERE sid=1) 
MINUS (SELECT sid FROM student WHERE sid=1); 

Можно, конечно, избежать МИНУС с помощью:

SELECT sid 
    FROM enroll 
WHERE cid IN (SELECT cid FROM enroll WHERE sid=1) 
    AND sid != 1 
GROUP by sid 
HAVING COUNT(*) = (SELECT COUNT(*) FROM enroll WHERE sid=1) 
0

Попробуйте

SELECT s.sid 
FROM student s, enroll e 
WHERE s.sid = e.sid 
AND e.cid IN (SELECT cid FROM course WHERE sid=1) 
AND s.sid <> 1 
+0

(a) Пожалуйста, не используйте старую (до 1992 года) нотацию, используя список имен таблиц, разделенных запятыми, в предложении FROM; используйте явное обозначение JOIN. (b) Этот запрос выбирает студентов, которые имеют по крайней мере один курс, общий с «sid = 1», а не учащиеся, изучающие каждый курс, который «sid = 1» изучает (и, возможно, некоторые дополнительные). В исходном запросе учатся студенты, которые изучают все те же курсы, что и 'sid = 1'. –

+0

О да! Ты прав! –

Смежные вопросы