SQL: INNER JOIN + EXISTE PAS
Je suis en train de créer une instruction SQL où j'ai besoin d'adhérer à 3 tables
EnrollStudents
EnrollID UserID SubjID
1 1 1
2 1 2
3 1 3
4 3 1
5 7 2
Étudiants
StudentID UserID YearID
1 1 1
2 3 1
3 7 1
Sujets
SubjID SubjCode YearID
1 English 1
2 Math 1
3 Science 1
et la sortie doit être...
UserID
2
3
depuis User 1
déjà inscrits tous les sujets, tout en User 3
et User 7
sont toujours affichés depuis quelques sujets sont toujours pas inscrits.
J'ai l'instruction SQL suivante avec pas de chance:
SELECT Students.UserID
FROM Students
WHERE Students.YearID = 1
AND Students.UserID NOT IN (SELECT EnrollStudents.UserID
FROM EnrollStudents)
Des idées?
Beau travail de mise en forme des tableaux, sqlfiddle importés magnifiquement.
OriginalL'auteur abramlimpin | 2012-07-12
Vous devez vous connecter pour publier un commentaire.
...attendez une minute. Je pense que vous avez le mélange jusqu'à votre "StudentID" et "nom d'utilisateur" dans votre exemple de sortie et
EnrollStudents
table.http://sqlfiddle.com/#!3/61618/1
Sera le nom d'utilisateur enregistre encore afficher si la EnrollStudent est vide?
Oui, vous avez raison. J'ai édité, et cela devrait faire l'affaire.
Oui, comme vous pouvez le voir dans la sqlfiddle, l'utilisateur 7 est à venir et qu'ils ne sont pas inscrits à rien
Ce n'est pas mon point. Vous avez des Id d'utilisateur (1,3,7) dans le
Students
table, mais dansEnrollStudents
vous faites référence à Id d'utilisateur (1,2,3). Je pense que vous vouliez dire StudentID.OriginalL'auteur lc.
SQL Violon Exemple
OriginalL'auteur RedFilter
Il semble que vous essayez de qualifier tous les étudiants en première année qui n'ont pas inscrit à la première année des classes requises, d'où la recherche d'obtenir que l'élève 2 et 3. Vos données a tout le monde dans le groupe d'un seul yearID, mais je soupçonne en fait, vous avez des données qui s'étend sur plusieurs années et vous êtes explicitement à ceux des étudiants en année 1, et que ces sujets qui sont ÉGALEMENT associés à la première année d'exigences.
La première requête (YrSubjects) les résultats de la pré-total le nombre de classes pour l'année en question afin de ne pas avoir à répéter cette opération pour chaque élève. Juste une fois... Avec ça comme un non affecté REJOINDRE le reste de la requête sera un Cartésien, mais un enregistrement par personne, pas de doublons, de toute façon.
Suivant est le reste de la tables de jointures. Obtenez les étudiants qui sont inscrits à des sujets qui ne sont associés à l'année 1. La clause where explicitement restreint à ces "1ère année" des étudiants.
La finale de la clause HAVING applique le comte d'inscriptions qui sont de MOINS que le total des sujets de première année des exigences. Avec cette requête, vous ne sont pas "fixes" dans un certain codée en dur nombre de sujets vous ATTENDENT...
OriginalL'auteur DRapp