Comment effectuer une FULL OUTER JOIN dans MySQL ?
P粉930534280
P粉930534280 2023-08-23 15:16:38
0
2
510
<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粉930534280
P粉930534280

répondre à tous(2)
P粉022723606

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.

P粉148782096

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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal