2010-07-29 4 views

Répondre

125

Vous utilisez une jointure automatique lorsqu'une table référence des données en elle-même. Par exemple, une table Employee peut avoir une colonne SupervisorID qui pointe vers l'employé qui est le patron de l'employé actuel.

Pour interroger les données et obtenir des informations pour les deux personnes dans une rangée, vous pouvez rejoindre l'auto comme ceci:

select e1.EmployeeID, 
    e1.FirstName, 
    e1.LastName, 
    e1.SupervisorID, 
    e2.FirstName as SupervisorFirstName, 
    e2.LastName as SupervisorLastName 
from Employee e1 
left outer join Employee e2 on e1.SupervisorID = e2.EmployeeID 
+0

qui ressemble à un externe auto me joindre? –

+2

@JoeCaruso C'est parce que c'est;) – RedFilter

+2

Je me demande pourquoi personne ne souligne la partie "dans la même rangée". N'est-ce pas le point de faire une auto-adhésion? –

14

Une jointure réflexive est tout simplement lorsque vous rejoignez une table avec elle-même. Il n'y a pas de mot-clé SELF JOIN, vous venez d'écrire une jointure ordinaire où les deux tables impliquées dans la jointure sont la même table. Une chose à noter est que lorsque vous vous inscrivez vous-même, il est nécessaire d'utiliser un alias pour la table sinon le nom de la table serait ambigu.

Cette fonction est utile lorsque vous souhaitez corréler des paires de lignes d'une même table, par exemple une relation parent-enfant. La requête suivante renvoie les noms de toutes les sous-catégories immédiates de la catégorie "Cuisine".

SELECT T2.name 
FROM category T1 
JOIN category T2 
ON T2.parent = T1.id 
WHERE T1.name = 'Kitchen' 
+0

Content de voir ce commentaire .. ON T2.parent = T1.id (parce que cela affecte le résultat si nous échangeons 'parent' et 'id' dedans) – himanshupareek66

+0

Bon à mentionner il n'y a pas de mot clé 'SELF JOIN'. J'étais confus à propos de cette partie! – nclsvh

6

Vous utiliseriez une auto-jonction sur une table qui "se réfère" à elle-même. une table d'employés où managerid est une clé étrangère à employeeid sur cette même table.

Exemple:

SELECT E.name, ME.name AS manager 
FROM dbo.Employees E 
LEFT JOIN dbo.Employees ME 
ON ME.employeeid = E.managerid 
+0

ON ME.employeeid = E.managerid créera un résultat différent au lieu de ON ME.managerid = E.employeeid – himanshupareek66

12

SQL autojointure est tout simplement une jointure normale qui est utilisée pour se joindre à une table pour lui-même.

Exemple:

Select * 
FROM Table t1, Table t2 
WHERE t1.Id = t2.ID 
+16

Ne serait-il pas plus sûr d'utiliser 'SELECT t1. *' Afin d'éviter les noms de colonne en double dans le résultat? – Matthieu

41

Eh bien, un exemple classique est l'endroit où vous vouliez obtenir une liste des employés et leurs gestionnaires immédiats:

select e.employee as employee, b.employee as boss 
from emptable e, emptable b 
where e.manager_id = b.empolyee_id 
order by 1 

Il est essentiellement utilisé là où il existe une relation entre les lignes stocké dans la même table.

  • employés.
  • marketing à plusieurs niveaux.
  • parties de la machine.

Et ainsi de suite ...

+7

Boo pour la syntaxe non-ANSI et en utilisant ordinal dans la clause 'ORDER BY' plutôt qu'un nom de colonne. – RedFilter

+14

Boo revient à vous pour manquer le point de la réponse :-) J'ai tendance à utiliser la syntaxe la plus simple qui fonctionne puisque le bon SGBD ne laissera pas cela affecter la performance. – paxdiablo

+0

meilleure réponse jusqu'à présent ... :) –

Questions connexes