Question

Je ne comprends pas le besoin d'auto-joint. Quelqu'un peut-il s'il vous plaît me les expliquer?

Un exemple simple serait très utile.

Était-ce utile?

La solution

Vous pouvez voir autojointure comme deux tables identiques. Mais dans la normalisation, vous ne pouvez pas créer deux copies de la table afin que vous venez d'avoir deux tables simulez avec autojointure.

Supposons que vous ayez deux tables:

Tableau emp1

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

Tableau 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 ses noms ou ses boss':

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

Ce qui va afficher le tableau suivant:

Name  Boss
ABC   XYZ
DEF   ABC
XYZ   DEF

Autres conseils

Il est assez courant quand vous avez une table qui référence elle-même. Exemple: une table d'employés où chaque employé peut avoir un gestionnaire, et que 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

Une jointure réflexive est une jointure d'une table avec elle-même.

Un cas d'utilisation commune est lorsque la table des entités stocke (enregistrements) qui ont une relation hiérarchique entre eux . Par exemple, une table contenant des informations de personne (nom, date de naissance, adresse ...) et comprenant une colonne où l'ID du Père (et / ou de la mère) est inclus. 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 sa mère, avec un second moi rejoindre etc. et même grands-parents, etc ...) dans la même requête.

Disons que vous avez un users de table, mis en place comme ceci:

  • ID utilisateur
  • nom d'utilisateur
  • ID de gestionnaire de l'utilisateur

Dans cette situation, si l'on voulait tirer à la fois des informations de l'utilisateur et informations du gestionnaire dans une requête, vous pouvez 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

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. Ceux-ci seraient les ID des autres pages dans la même table. Si à un moment donné que vous voulez obtenir un triple de pages successives, vous feriez deux Autojointures sur les colonnes de next et previous avec la colonne id de la même table.

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

Table (Employee): 

int id,
varchar name,
int manager_id

Vous pouvez ensuite utiliser la sélection suivante 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

Sans la capacité d'une table à se faire référence, il faudrait 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 pour lui-même et sql traite comme deux tables séparées, donc tout est stocké bien dans un seul endroit.

Outre les réponses mentionnées ci-dessus (qui sont très bien expliquées), je voudrais ajouter un exemple afin que l'utilisation de jointure réflexive peut facilement montrer. Supposons que vous ayez une table nommée CLIENTS qui possède les attributs suivants: CustomerID, CustomerName, ContactName, Ville, Pays. Maintenant, vous voulez la liste de tous ceux qui sont de la « même ville ». Vous devrez penser à une réplique de ce tableau afin que nous puissions les rejoindre sur la base de la ville. La requête ci-dessous montrent 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;

Il y a beaucoup de réponses, mais il y a une variation qui est tout aussi correcte. Vous pouvez placer votre joindre les conditions dans la déclaration au lieu de se joindre à 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 vous voulez parfois e1.manager_id> e2.id

L'avantage de connaître les deux scénarios est parfois vous avez une tonne de WHERE ou JOIN conditions et que vous voulez placer votre auto dans des conditions de jointure autre clause de garder votre code lisible.

Personne ne décrit ce qui se passe lorsqu'un employé ne dispose pas d'un gestionnaire. Huh? Ils ne sont pas inclus dans le jeu de résultats. Que faire si vous voulez inclure les employés qui ne sont pas responsables, mais vous ne voulez pas des combinaisons incorrectes retournées?

Essayez ce petit chien;

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

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

autojointure est utile lorsque vous devez évaluer les données de la table avec elle-même. Ce qui signifie qu'il va corrèle les lignes de la même table.

Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName

Par exemple, nous voulons trouver les noms des employés dont la désignation initiale égale à la désignation actuelle. Nous pouvons résoudre ce en utilisant l'auto à rejoindre comme suit.

SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId

Il est la base de données équivalente d'une liste chaînée / arbre, où une rangée contient une référence dans une certaine mesure à une autre ligne.

Voici le exaplanation de soi se joindre en termes simples. Auto jointure est un autre type de jointure. Si vous avez compris d'autres types de jointures (intérieur, extérieur, et se joint à la Croix), puis rejoindre l'auto devrait être simple. Dans INNER, extérieur et CROSS REJOINT, vous rejoignez 2 ou plusieurs tables différentes. Cependant, dans l'auto vous joindre à joindre à la même table avec mmêe. Ici, nous n'avons pas 2 tables différentes, mais traiter la même table comme une table différente en utilisant des alias de table. Si ce n'est pas encore clair, je recommanderais de regarder les vidéos sur youtube suivant.

auto Inscrivez-vous avec un exemple

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top