0

次のテーブルがあります

  • 生徒(シド、スネーム、年齢)
  • コース(cid、cname、期間)
  • 登録 (sid、cid、日付)

sid = 1 が受講したコースを受講したすべての 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);
  1. 最初の count(*) は何を指していますか?
  2. クエリのより単純なバージョンはありますか?
4

2 に答える 2

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
于 2012-10-05T06:03:41.737 に答える
0

1 つ目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);

次を使用して、MINUSを確実に回避できます。

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) 
于 2012-10-05T05:49:53.920 に答える