1

説明するのが難しい単純な問題があります(少なくとも私にとっては)。

データベース モデリング コースの次のスキーマを検討してください。

COURSE (cid, did, name, num, creditHours),

STUDENT (sid、fname、lname、did)

ENROLLED_IN (eid、sid、cid)

course.name=Math" と "Science" に登録している学生の sid を見つけるクエリは何ですか?

申し訳ありませんが、残りを理解できると思って同様の(より簡単な)質問をしましたが、できませんでした:https://stackoverflow.com/questions/18902489/how-to-find-entries-in-database-that-会う-複数の一致

4

1 に答える 1

3

他のページが示唆するように、同じテーブルに対して 2 つの JOIN を実行する必要があります。しかし、cid ではなく Name を使用したいので、登録データに基づいて COURSE に参加します。

SELECT DISTINCT s.sid
FROM STUDENT s
INNER JOIN ENROLLED_IN e ON e.sid = s.sid
INNER JOIN COURSE c ON c.cid = e.cid AND c.Name = 'Math'
INNER JOIN COURSE c2 ON c2.cid = e.cid AND c2.Name = 'Science'

学生の記録全体が必要な場合は...

SELECT STUDENT.*
FROM STUDENT
INNER JOIN
  (SELECT DISTINCT s.sid
   FROM STUDENT s
   INNER JOIN ENROLLED_IN e ON e.sid = s.sid
   INNER JOIN COURSE c ON c.cid = e.cid AND c.Name = 'Math'
   INNER JOIN COURSE c2 ON c2.cid = e.cid AND c2.Name = 'Science'
) t0 ON t0.sid = STUDENT.sid

編集 DISTINCT の代わりに、GROUP BY、ala を使用することもできます

   SELECT s.sid
   FROM STUDENT s
   INNER JOIN ENROLLED_IN e ON e.sid = s.sid
   INNER JOIN COURSE c ON c.cid = e.cid AND c.Name = 'Math'
   INNER JOIN COURSE c2 ON c2.cid = e.cid AND c2.Name = 'Science'
   GROUP BY s.sid

HAVING編集し、2 つの結合を使用する代わりに、句を使用できます

SELECT s.sid
FROM STUDENT s
INNER JOIN ENROLLED_IN e ON e.sid = s.sid
INNER JOIN COURSE c ON c.cid = e.cid
WHERE c.Name IN ('Math', 'Science')
GROUP BY s.sid
HAVING COUNT(*) = 2
于 2013-09-19T19:32:02.473 に答える