Explication de l'auto-jointures

Je ne comprends pas le besoin de s'unir. Quelqu'un peut-il expliquer à moi?

Un exemple simple serait très utile.

66
demandé sur Mat 2010-03-17 01:07:42

12 réponses

vous pouvez voir auto-joindre comme deux tables identiques. Mais dans la normalisation, vous ne pouvez pas créer deux copies de la table donc vous simulez juste avoir deux tables avec self-join.

supposons que vous ayez deux tables:

Table emp1

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   

Table emp2

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   

Maintenant, si vous voulez obtenir le nom de chaque employé avec son patron les noms de:

select c1.Name , c2.Name As Boss
from emp1 c1
    inner join emp2 c2 on c1.Boss_id = c2.Id

qui produira le tableau suivant:

Name  Boss
ABC   XYZ
DEF   ABC
XYZ   DEF
72
répondu pointlesspolitics 2018-04-11 20:52:49

c'est assez courant quand vous avez un tableau qui se réfère à lui-même. Exemple: une table d'employés où chaque employé peut avoir un gestionnaire, et vous voulez énumérer tous les employés et le nom de leur gestionnaire.

SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
19
répondu windyjonas 2010-03-16 22:15:52

Une auto-jointure est une jointure d'une table avec elle-même.

un cas d'usage courant est lorsque la table stocke des entités (enregistrements) qui ont une relation hiérarchique entre elles . Par exemple, un tableau contenant des informations sur la personne (Nom, Date de naissance, adresse)...) et y compris une colonne où L'identification du Père (et/ou de la mère) est incluse. Puis avec une petite requête comme

SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN  myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago'  -- Or some other condition or none

nous pouvons obtenir des informations sur l'enfant et le père (et la mère, avec un second moi rejoignent etc. et même les grands parents etc...) dans la même requête.

16
répondu mjv 2013-10-10 21:31:06

disons que vous avez une table users , configurée comme ceci:

  • ID utilisateur
  • nom d'utilisateur
  • du responsable de l'utilisateur ID

dans cette situation, si vous voulez extraire à la fois l'information de l'utilisateur et l'information du gestionnaire dans une requête, vous pourriez faire ceci:

SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
5
répondu ceejayoz 2010-03-16 22:15:19

Ils sont utiles si votre table est auto-référentielle. Par exemple, pour un tableau de pages, chaque page peut avoir un lien next et previous . Ce sont les Id des autres pages du même tableau. Si à un certain moment vous voulez obtenir un triple de pages successives, vous feriez deux auto-jointures sur les colonnes next et previous avec la même colonne de table id .

4
répondu Max Shawabkeh 2010-03-16 22:16:03

sans la possibilité pour une table de se référencer, nous aurions à créer autant de tables pour les niveaux de hiérarchie que le nombre de couches dans la hiérarchie. Mais puisque cette fonctionnalité est disponible, vous rejoignez la table à elle-même et sql le traite comme deux tables séparées, de sorte que tout est bien stocké dans un endroit.

4
répondu Eugene 2010-03-16 22:25:05

Imaginez une table appelée Employee comme décrit ci-dessous. Tous les employés ont un gestionnaire qui est aussi un employé (peut-être à l'exception du CEO, dont le manager_id serait nul)

Table (Employee): 

int id,
varchar name,
int manager_id

vous pouvez ensuite utiliser le select suivant pour trouver tous les employés et leurs gestionnaires:

select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
3
répondu Klaus Byskov Pedersen 2010-03-16 22:22:14

il y a beaucoup de bonnes réponses ici, mais il y a une variation qui est tout aussi correcte. Vous pouvez placer vos conditions de jointure dans la déclaration de jointure au lieu de la clause où.

SELECT e1.emp_id AS 'Emp_ID'
  , e1.emp_name AS 'Emp_Name'
  , e2.emp_id AS 'Manager_ID'
  , e2.emp_name AS 'Manager_Name'
FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id

gardez à l'esprit que parfois vous voulez e1.manager_id > e2.carte d'identité no 151930920."

l'avantage de connaître les deux scénarios est parfois vous avez une tonne D'où ou rejoindre les conditions et vous voulez placer vos conditions d'adhésion dans l'autre clause pour garder votre code lisible.

personne n'a parlé de ce qui se passe lorsqu'un employé n'a pas de gestionnaire. Hein? Ils ne sont pas inclus dans le jeu de résultats. Que faire si vous voulez inclure des employés qui n'ont pas de gestionnaires, mais que vous ne voulez pas que les combinaisons incorrectes soient retournées?

essayez ce chiot;

SELECT e1.emp_id AS 'Emp_ID'
   , e1.emp_name AS 'Emp_Name'
   , e2.emp_id AS 'Manager_ID'
   , e2.emp_name AS 'Manager_Name'
FROM Employee e1 LEFT JOIN Employee e2 
   ON e1.emp_id = e2.emp_id
   AND e1.emp_name = e2.emp_name
   AND e1.every_other_matching_column = e2.every_other_matching_column
3
répondu BClaydon 2014-09-02 18:07:55

en dehors des réponses mentionnées ci-dessus (qui sont très bien expliquées), je voudrais ajouter un exemple pour que l'utilisation de L'auto-jointure puisse être facilement montrée. Supposons que vous ayez une table nommée CUSTOMERS qui possède les attributs suivants:: CustomerID, Nomclient, Contact, Ville, Pays. Maintenant, vous voulez lister tous ceux qui sont de la "même ville" . Vous devrez penser à une réplique de cette table afin que nous puissions les rejoindre sur la base de la ville. La requête ci-dessous montre clairement ce que cela signifie:

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, 
A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City 
ORDER BY A.City;
3
répondu Mazhar MIK 2017-10-07 06:30:12

un cas d'utilisation est la vérification des enregistrements en double dans une base de données.

SELECT A.Id FROM My_Bookings A, My_Bookings B
WHERE A.Name = B.Name
AND A.Date = B.Date
AND A.Id != B.Id
1
répondu Steven Stewart-Gallus 2017-02-14 21:01:51

C'est la base de données équivalent d'une liste chaînée/arbre, où une ligne contient une référence à une autre ligne.

0
répondu Unsliced 2010-03-17 08:03:32

voici l'exaplanation de moi-même rejoindre en termes profanes. SELF join n'est pas un type différent de join. Si vous avez compris d'autres types de jointures (internes, externes et croisées), alors la jointure de soi doit être simple en avant. Dans les joints intérieurs, extérieurs et en croix, vous rejoignez 2 ou plusieurs tables différentes. Cependant, en vous rejoignez vous rejoignez la même table avec sonlef. Ici, nous n'avons pas deux tables différentes, mais traitons la même table comme une table différente en utilisant des alias de table. Si ce n'est toujours pas clair, je recommande de regarder les vidéos youtube suivantes.

Auto Jointure avec un exemple

-4
répondu user1472512 2012-08-31 13:25:03