2013-07-02 6 views
8

J'ai le tableau suivant avec les valeursÉcrire une requête de jointure automatique?

CREATE TABLE #tmpEmployee(ID int, EmpName varchar(50), EmpBossID int) 

insert into #tmpEmployee values (1, 'Abhijit', 2); 
insert into #tmpEmployee values (2, 'Haris', 3); 
insert into #tmpEmployee values (3, 'Sanal', 0); 

Maintenant, je veux que le résultat suivant se

ID EmpName BossName 
1 Abhijit Haris 
2 Haris Sanal 

donc j'ai écrit la requête suivante.

select E1.ID,E1.EmpName, E.EmpName as BossName from #tmpEmployee E inner join #tmpEmployee E1 on E1.EmpBossID=E.ID. 

Mais le problème est le 3ème employé (Sanal) n'a pas de patron. Je veux donc ce résultat exact:

ID EmpName BossName 
1 Abhijit Haris 
2 Haris Sanal 
3 Sanal Null 

Que dois-je faire?

+2

Remplacez la 'jointure interne' par [' left outer join'] (http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-join). –

+0

sélectionnez E1.ID, E1.EmpName, E.EmpName comme BossName de #tmpEmployee E jointure externe gauche #tmpEmployee E1 = E1.EmpBossID E.ID essayé mais le résultat se ID \t EmpName \t BossName NULL \t NULL \t Abhijit Abhijit \t Haris Haris \t Sanal – Haris

+2

Il suffit de passer à une jointure à droite. – Curt

Répondre

1

Utilisez RIGHT JOIN

select E1.ID,E1.EmpName, E.EmpName as BossName from #tmpEmployee E right join #tmpEmployee E1 on E1.EmpBossID=E.ID 

ID EmpName BossName 
1 Abhijit Haris 
2 Haris Sanal 
3 Sanal NULL 

Je pense que son ok pour u

0

essayer ce ...

Utilisez les boutons Gauche Rejoindre ..

select E.ID,E.EmpName, E1.EmpName as BossName from #tmpEmployee E left outer join #tmpEmployee E1 on E1.EmpBossID=E.ID 

ID EmpName BossName 
1 Abhijit Haris 
2 Haris Sanal 
3 Sanal NULL 
+0

Non, ce n'est pas correct.Je reçois réponse devenir ID \t EmpName \t BossName NULL \t NULL \t Abhijit Abhijit \t Haris Haris \t Sanal – Haris

+0

Pas qui a également obtenir une mauvaise réponse. Au moins, assurez-vous que l'envoi cmnt sont corrects –

1

Utilisez un LEFT JOIN et inverser l'ordre de vos tables:

select 
    E.ID, 
    E.EmpName, 
    B.EmpName as BossName 
from tmpEmployee E 
left join tmpEmployee B on E.EmpBossID = B.ID 

Voir une live demo de cette requête sur SQLFiddle

Mettre la partie de « employé » la jointure premier signifie que tous les employés sont répertoriés.

Alliant une gauche rejoindre signifie que les employés sans patron (par exemple, le chef de la direction) seront cotées encore, mais aura un null pour la colonne BossName.

Si vous voulez vraiment que les personnes énumérées si elles ont un patron, changer la requête simplement JOIN au lieu de LEFT JOIN (notez que la valeur par défaut type de jointure est INNER)

P.S. le formatage de votre requête ne blesse pas non plus:

+0

Merci pour vos conseils. Mais réponse devient pas corriger d'obtenir résultat comme ID \t EmpName \t BossName Abhijit \t NULL Haris \t Abhijit Sanal \t Haris – Haris

+0

Oops! Vous avez la jointure dans le mauvais sens. J'ai mis à jour le lien query et sqlfiddle. Renommer les alias de la table l'a rendu plus clair aussi. Cela fonctionne correctement maintenant – Bohemian

Questions connexes