recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment effectuer une FULL OUTER JOIN dans MySQL ?

<p>Je souhaite effectuer une <em>jointure externe complète</em> Est-il possible? MySQL prend-il en charge les jointures externes complètes <em> ? </p>
P粉930534280P粉930534280506 Il y a quelques jours543

répondre à tous(2)je répondrai

  • P粉022723606

    P粉0227236062023-08-24 11:52:41

    La réponse donnée par

    Pablo Santa Cruz est correcte, cependant, si quelqu'un tombe sur cette page et a besoin de plus de précisions, voici une ventilation détaillée ;

    Exemple de tableau

    Supposons que nous ayons le tableau suivant :

    -- t1
    id  name
    1   Tim
    2   Marta
    
    -- t2
    id  name
    1   Tim
    3   Katarina
    

    Connexion intérieure

    Connexion interne, comme indiqué ci-dessous :

    SELECT *
    FROM `t1`
    INNER JOIN `t2` ON `t1`.`id` = `t2`.`id`;

    nous permettra uniquement de voir les enregistrements qui apparaissent dans les deux tableaux, comme indiqué ci-dessous :

    1 Tim  1 Tim
    

    Les jointures internes n'ont aucune direction (par exemple gauche ou droite) car elles sont explicitement bidirectionnelles - nous avons besoin que les deux côtés correspondent.

    JOINTURE EXTERNE

    Les jointures externes, en revanche, sont utilisées pour rechercher des enregistrements qui peuvent ne pas correspondre dans une autre table. Par conséquent, vous devez spécifier de quel côté de la connexion il peut y avoir des enregistrements manquants. Abréviations pour

     ; j'utiliserai leurs noms complets ci-dessous pour renforcer le concept de jointures externes et de jointures internes. LEFT JOINRIGHT JOINLEFT OUTER JOINRIGHT OUTER JOIN

    Jointure externe gauche

    Jointure externe gauche, comme indiqué ci-dessous :

    SELECT *
    FROM `t1`
    LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;

    ...obtiendra tous les enregistrements de la table de gauche, qu'ils aient ou non une correspondance dans la table de droite, comme ceci :

    1 Tim   1    Tim
    2 Marta NULL NULL
    

    Jointure externe droite

    Jointure externe droite, comme indiqué ci-dessous :

    SELECT *
    FROM `t1`
    RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;

    ...obtiendra tous les enregistrements de la table de droite, qu'ils aient ou non une correspondance dans la table de gauche, comme ceci :

    1    Tim   1  Tim
    NULL NULL  3  Katarina
    

    Jointure externe complète

    Une jointure externe complète nous donnera tous les enregistrements des deux tables, qu'ils aient une correspondance dans l'autre table, ou NULL des deux côtés sinon. Le résultat ressemble à ceci :

    1    Tim   1    Tim
    2    Marta NULL NULL
    NULL NULL  3    Katarina
    

    Cependant, comme l'a souligné Pablo Santa Cruz, MySQL ne prend pas en charge cela. Nous pouvons le simuler avec une UNION de jointure gauche et de jointure droite comme ceci :

    SELECT *
    FROM `t1`
    LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
    
    UNION
    
    SELECT *
    FROM `t1`
    RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;

    Vous pouvez considérer

    comme « exécuter ces deux requêtes, puis empiler les résultats ensemble » ; certaines lignes proviendront de la première requête et d'autres de la seconde. UNION

    Notez que

    dans MySQL élimine les doublons exacts : Tim apparaîtra ici dans les deux requêtes, mais les résultats pour UNION 会消除精确的重复项:Tim 会出现在此处的两个查询中,但 UNION 的结果仅列出他一次。我的数据库专家同事认为不应依赖这种行为。因此,为了更明确地说明这一点,我们可以向第二个查询添加一个 WHERE ne le répertorient qu'une seule fois. Mes collègues experts en bases de données estiment qu'il ne faut pas se fier à ce comportement. Ainsi, pour rendre cela plus explicite, nous pouvons ajouter une clause WHERE à la deuxième requête :

    SELECT *
    FROM `t1`
    LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
    
    UNION
    
    SELECT *
    FROM `t1`
    RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
    WHERE `t1`.`id` IS NULL;

    D'un autre côté, si pour une raison quelconque vous souhaitez voir les doublons, vous pouvez utiliser UNION ALL.

    répondre
    0
  • P粉148782096

    P粉1487820962023-08-24 10:04:47

    Vous n'avez pas de connexions complètes dans MySQL, mais vous pouvez certainement les simuler.

    Pour le code exemple transcrit de cette question Stack Overflow

    vous avez :

    Il existe deux tables t1 et t2 :
    SELECT * FROM t1
    LEFT JOIN t2 ON t1.id = t2.id
    UNION
    SELECT * FROM t1
    RIGHT JOIN t2 ON t1.id = t2.id

    La requête ci-dessus convient au cas particulier où l'opération jointure externe complète ne produira aucune ligne en double. La requête ci-dessus s'appuie sur l'opérateur d'ensemble UNION pour supprimer les lignes en double introduites par le modèle de requête. Nous pouvons éviter d'introduire des lignes en double en utilisant le modèle anti-join

    sur la deuxième requête, puis en utilisant l'opérateur d'ensemble UNION ALL pour combiner les deux ensembles. Dans le cas plus général où une jointure externe complète renverra des lignes en double, nous pouvons faire ceci : 🎜
    SELECT * FROM t1
    LEFT JOIN t2 ON t1.id = t2.id
    UNION ALL
    SELECT * FROM t1
    RIGHT JOIN t2 ON t1.id = t2.id
    WHERE t1.id IS NULL

    répondre
    0
  • Annulerrépondre