2014-09-13 3 views
0

Maintenant, il ya deux tables étudiant (sid, nom) et cours (cid, nom), dont la relation est many-to-many. Il y a donc une autre table student_course (sid, cid) qui stocke les informations sur les cours qui ont été choisis par qui.Obtenez les cours choisis par tous les étudiants

Comment écrire le sql qui peut obtenir les cours qui ont été choisis par tous les étudiants?

+0

ok pas de problème bro, ça arrive – Skynet

Répondre

2

solution standard: utilisez la NOT EXISTS (... NOT EXISTS (...)) construction:

  • trouver tous les cours dans lesquels tous les étudiants prennent partie
  • == >> Il ne doit pas exister un étudiant qui ne prendre part à ce cours

SELECT * FROM course c 
WHERE NOT EXISTS (
     SELECT * from student s 
     WHERE NOT EXISTS (
       SELECT * from student_course cs 
       WHERE cs.sid = s.sid 
       AND cs.cid = c.cid 
       ) 
     ) 
     ; 

Cette requête est souvent plus rapide (données d'index de appropiate) que la count() == count() variante. La raison de ceci: vous n'avez pas à compter tous les les enregistrements (distincts); une fois que vous avez trouvé un étudiant qui ne pas prendre ce Bien sûr, vous pouvez omettre ce cours de votre liste des suspects. Aussi: ANTI-jointures peuvent souvent utiliser des index [peut donc un count(), mais il doit encore compter tous les les (clés) clés distinctes dans l'index]

+0

J'aime ma réponse. Cependant, j'aime mieux le tien. Il fonctionne également beaucoup mieux lorsqu'il est exécuté par mon même violon. Alors faites un vote – pinkfloydx33

1
Select c.cid, c.name 
From course c where 
(select count(1) from student) = (select count(1) from student_course sc where sc.cid = c.cid); 

See SQL Fiddle

Il trouve tous les cours où le nombre d'entrées pour ce cours dans la table student_course correspond au nombre d'étudiants

CID NAME 
1 Test Course1 
4 Test Course4 
Questions connexes