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 ?
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