2009-08-04 5 views
2

J'ai un problème de recherche plusieurs tables , j'ai 2 tablesComment recherchez-vous les jointures Right/Left?

tblcourse

-courseid

-nom

-status

tblenroll

-courseid (détient coursid de tblcourse)

-studentid

permet de dire un étudiant a 1990 num étudiant et il a enregistré 2 cours de tblenrol

Je veux obtenir le nom des cours que l'année 1990 a et ceux qu'il aint abonnée

le plus proche que je reçois est une jointure externe droite à tblcourses puis j'obtiens le résultat que je veux, mais une fois que j'attache une clause where il ne me donnera pas le reste des cours qui n'ont pas son numéro d'étudiant.

Toute aide !!

EDIT (ajouté de réponse publié par op)

Hey, merci pour la réponse. Ok je ne pense pas que je l'ai expliqué correctement.

tblcourse tiendra de nombreux cours tblenroll tient beaucoup inscriptions

Alors, imaginez que nous avons 6 cours. registres étudiants 1990 pour 3 et étudiant 1880 pour 1 (un que l'année 1990 n'a pas choisi)

Quand nous courons ceci:

WHERE (tblenroll.studentid = 1990 or tblenroll.studentid is null) 

ou

where e.studentid is null or e.studentid is not null and e.studentid = 1990 

il ramassera 5 cours, 3 enregistrés en 1990 et 2 NULLS. Le sixième est inscrit à 1880.

Cette requête apporte les bons résultats, mais pas pour un étudiant spécifique

SELECT 
    tblenroll.studentid as stud, 
    tblcourse.name, 
    tblenroll.studentid, 
    tblenroll.courseid, 
    tblcourse.courseid, 
FROM 
    tblenroll 
Right Join tblcourse ON tblenroll.courseid = tblcourse.courseid 

Avec ce qui précède, je vais me

1880-1 1990-3 NULL - 2

des choses qui déroutent!

+1

peut vous envoyer votre sql? – andrewWinn

Répondre

2
select tblcourse.name, e.studentid 
from tblcourse c left join tblenroll e on c.courseid = e.courseid 
where e.studentid is null or e.studentid is not null and e.studentid = :id 

il en résultera

course1 1990 
course2 NULL 
course3 NULL 
course4 1990 
... 

selon votre DB, vous pouvez utiliser une sorte de fonction IIF pour mettre 1 ou 0, vrai ou faux - quel que soit le drapeau comme deuxième élément

0

Vous avez probablement juste besoin de laisser le studentid être nul ainsi que l'identifiant réel que vous interrogez.

Essayez, par exemple:

SELECT tblenroll.studentid, tblcourse.courseid, tblcourse.name, tblcourse.status 
FROM tblenroll RIGHT OUTER JOIN tblcourse ON tblenroll.courseid = tblcourse.courseid 
WHERE (tblenroll.studentid = 1990 
or tblenroll.studentid is null) -- this allows the courses in which 1990 is not enrolled 

Edit: Je ne pensais pas tout à fait cela par la première fois. La requête ci-dessus est mon approche naieve et renvoie probablement les mêmes résultats que l'OP ne veut pas. L'astuce consiste à ne pas utiliser une clause where après que les tables sont jointes, mais plutôt à limiter les lignes de tblenroll qui participent à la jointure.

Je beleive cela devrait fonctionner (je l'ai testé avec des tables similaires/structure sur SQL Server 2005):

SELECT tblenroll.studentid, tblcourse.courseid, tblcourse.name, tblcourse.status 
FROM tblenroll RIGHT OUTER JOIN tblcourse ON tblenroll.courseid = tblcourse.courseid 
    AND tblenroll.studentid = 1990 
Questions connexes