2010-05-09 6 views
2

J'ai trois tables dont j'ai besoin pour joindre ensemble et obtenir une combinaison de résultats. J'ai essayé d'utiliser les jointures gauche/droite mais elles ne donnent pas les résultats souhaités.Comment avoir plusieurs tables avec plusieurs jointures

Par exemple:

Tableau 1 - PERSONNEL

id  name 
1  John 
2  Fred 

Tableau 2 - STAFFMOBILERIGHTS

id  staffid  mobilerightsid  rights 
--this table is empty-- 

Tableau 3 - MOBILERIGHTS

id  rightname 
1  Login 
2  View 

et ce que je dois est-ce comme th résultat e ...

id name id staffid mobilerightsid rights id rightname 
1 John null null null  null 1 login 
1 John null null null  null 2 View 
2 Fred null null null  null 1 login 
2 Fred null null null  null 2 View 

J'ai essayé les suivantes:

SELECT * 
    FROM STAFFMOBILERIGHTS SMR 
    RIGHT JOIN STAFF STA 
    ON STA.STAFFID = SMR.STAFFID 
    RIGHT JOIN MOBILERIGHTS MRI 
    ON MRI.ID = SMR.MOBILERIGHTSID 

Mais cela ne retourne deux lignes comme suit:

id  name id staffid mobilerightsid rights id rightname 
null null null null null  null 1 login 
null null null null null  null 2 View 

Peut-ce que je suis en train de se faire réaliser et si oui, comment?

Merci

Répondre

1

De votre commentaire son clair maintenant que vous voulez un cross join (inclure toutes les lignes du personnel et mobilerights). Quelque chose comme ça devrait le faire

SELECT 
* 
FROM Staff, MobileRights 
LEFT OUTER JOIN StaffMobileRights ON StaffMobileRights.StaffId = Staff.Id 

La clause FROM précise que nous allons inclure toutes les lignes de la table du personnel, et toutes les lignes de la table MobileRights. Le résultat final contiendra donc des lignes (Staff * MobileRights).

Pour amener des lignes à partir de StaffMobileRights, nous avons également besoin d'une jointure à cette table. Nous utilisons une jointure LEFT OUTER pour nous assurer que nous incluons toujours le côté gauche (lignes dans la table de staff) mais nous ne sommes pas dérangés si aucune ligne n'existe sur le côté droit (table StaffMobileRights). Si aucune ligne n'existe pour la jointure, les valeurs NULL sont renvoyées.

+0

Oui STAFFMOBILERIGHTS permet efficacement un grand nombre à plusieurs rapports entre le personnel et MOBILERIGHTS mais il ne sera une ligne STAFFMOBILERIGHTS si un droit a été accordé. À l'heure actuelle, aucun droit n'a été accordé, donc il n'y a pas de rang dans STAFFMOBILERIGHTS. L'exécution de votre SQL ne renvoie aucune ligne. – williamsdb

+0

@williamsdb. Ahh, désolé oui - beaucoup plus clair ce que vous essayez de faire maintenant. Voir ma modification. – PaulG

+0

Bingo! Merci beaucoup c'est parfait. Maintenant, je pars pour voir si je peux comprendre ce que vous avez fait. Merci pour votre aide. Neil – williamsdb

0

Ce que vous demandez probablement, c'est de voir null où il n'y a pas de droits. Dans le style rectangulaire que les résultats sont toujours retournés, c'est la seule façon de le représenter avec une simple jointure:

De la requête de PaulG, je l'ai un peu modifié pour toujours obtenir tout ce qui forme la table STAFF.

SELECT 
* 
FROM STAFF 
RIGHT OUTER JOIN StaffMobileRights ON StaffMobileRights.StaffId = Staff.Id 
INNER JOIN MobileRights ON MobileRights.Id = StaffMobileRights.MobileRightsId 
Questions connexes