Question

Supposons que nous ayons un tableau A :

itemid mark
1      5
2      3

et tableau B :

itemid mark
1      3
3      5

Je souhaite rejoindre A*B sur A.itemid=B.itemid à droite et à gauche.c'est à dire.résultat:

itemid A.mark B.mark
1      5      3
2      3      NULL
3      NULL   5

Existe-t-il un moyen de le faire en une seule requête dans MySQL ?

Était-ce utile?

La solution

C'est ce qu'on appelle une jointure externe complète et elle n'est pas prise en charge nativement dans MySQL, à en juger par son documents.Vous pouvez contourner cette limitation en utilisant UNION comme décrit dans les commentaires de la page à laquelle j'ai lié.

[modifier] Puisque d'autres ont posté des extraits, c'est parti.Vous pouvez voir l'explication sur la page liée.

SELECT *
FROM A LEFT JOIN B ON A.id = B.id
UNION ALL
SELECT *
FROM A RIGHT JOIN B ON A.id = B.id
WHERE A.id IS NULL

Autres conseils

Cela pourrait nécessiter un peu de travail, mais voici du SQL

select distinct T.itemid, A.mark as "A.mark", B.mark as "B.mark"
    from (select * from A union select * from B) T 
    left join A on T.itemid = A.itemid 
    left join B on T.itemid = B.itemid;

Cela repose sur la jointure gauche, qui renvoie toutes les lignes de la table d'origine (dans ce cas, il s'agit de la table de sous-sélection T).S'il n'y a aucune correspondance dans la table jointe, la colonne sera alors définie sur NULL.

Cela fonctionne pour moi sur SQL Server :

select isnull(a.id, b.id), a.mark, b.mark
from a 
full outer join b on b.id = a.id
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top