Explication des auto-jointures

Je ne comprends pas le besoin de se joindre à soi. Quelqu’un peut-il me les expliquer?

Un exemple simple serait très utile.

Vous pouvez afficher la jointure automatique sous la forme de deux tables identiques. Mais dans la normalisation, vous ne pouvez pas créer deux copies de la table pour simuler simplement avoir deux tables avec auto-jointure.

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 les noms de son patron:

 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 

C’est assez courant quand vous avez une table qui se référence. Exemple: une table d’employés où chaque employé peut avoir un responsable et vous souhaitez répertorier tous les employés et le nom de leur responsable.

 SELECT e.name, m.name FROM employees e LEFT OUTER JOIN employees m ON e.manager = m.id 

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

Un cas d’utilisation courant est celui où 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 une colonne contenant l’ID du père (et / ou de la mère). 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 une deuxième auto-rejoindre, etc. et même les grands-parents, etc.) dans la même requête.

Disons que vous avez une table users , mis en place comme ça:

  • identifiant d’utilisateur
  • Nom d’utilisateur
  • ID du responsable de l’utilisateur

Dans cette situation, si vous souhaitez extraire à la fois les informations de l’utilisateur et celles du responsable dans une requête, vous pouvez procéder comme suit:

 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 

Ils sont utiles si votre table est auto-référentielle. Par exemple, pour une table de pages, chaque page peut avoir un lien next et previous . Ce sont les identifiants des autres pages de la même table. Si, à un moment donné, vous souhaitez obtenir un sortingplé de pages successives, vous effectuerez deux auto-jointures sur les colonnes next et previous avec la même colonne id la table.

Sans la possibilité pour une table de se référencer, il faudrait créer autant de tables pour les niveaux de hiérarchie que le nombre de couches dans la hiérarchie. Mais comme cette fonctionnalité est disponible, vous joignez la table à elle-même et sql le traite comme deux tables distinctes, de sorte que tout est stocké en un seul endroit.

Imaginez un tableau appelé Employee tel que décrit ci-dessous. Tous les employés ont un manager qui est également un employé (peut-être à l’exception du CEO, dont manager_id serait nul)

 Table (Employee): int id, varchar name, int manager_id 

Vous pouvez ensuite utiliser la sélection suivante pour rechercher tous les employés et leurs responsables:

 select e1.name, e2.name as ManagerName from Employee e1, Employee e2 where where e1.manager_id = e2.id 

Il y a beaucoup de réponses correctes ici, mais il y a une variation qui est tout aussi correcte. Vous pouvez placer vos conditions de jointure dans l’instruction de jointure au lieu de la clause WHERE.

 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.id

L’avantage de connaître les deux scénarios est parfois que vous avez une tonne de conditions WHERE ou JOIN et que vous souhaitez placer vos conditions de jointure automatique dans l’autre clause pour que votre code rest lisible.

Personne ne s’est occupé 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 souhaitez inclure des employés qui n’ont pas de gestionnaires mais que vous ne voulez pas que des 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 

Outre les réponses mentionnées ci-dessus (qui sont très bien expliquées), je voudrais append un exemple pour que l’utilisation de Self-Join puisse être facilement affichée. Supposons que vous ayez une table nommée CUSTOMERS qui possède les atsortingbuts suivants: CustomerID, CustomerName, ContactName, City, Country. Maintenant, vous voulez lister tous ceux qui viennent de la même ville. Vous devrez penser à une réplique de ce tableau pour pouvoir les rejoindre sur la base de CITY. La requête ci-dessous indiquera 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; 

Un cas d’utilisation consiste à vérifier les enregistrements en double dans une firebase database.

 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 

C’est la firebase database équivalente à une liste / arborescence liée, où une ligne contient une référence dans une certaine capacité à une autre ligne.

Voici l’exaplanation du self-join en termes simples. Auto-jointure n’est pas un type de jointure différent. Si vous avez compris d’autres types de jointures (jointures internes, externes et croisées), la jointure automatique doit être simple. Dans INNER, OUTER et CROSS JOINS, vous rejoignez deux tables différentes ou plus. Cependant, en vous rejoignant vous rejoignez la même table avec itslef. Ici, nous n’avons pas 2 tables différentes, mais traitons la même table comme une table différente à l’aide d’alias de table. Si ce n’est toujours pas clair, je vous recommande de regarder les vidéos youtube suivantes.

Self Join avec un exemple