2008-08-13 8 views
8

Supposons que nous avons une table A:extérieur Bidirectionnelle joindre

itemid mark 
1  5 
2  3 

et le tableau B:

itemid mark 
1  3 
3  5 

Je veux rejoindre A * B A.itemid = B.itemid droite et à gauche façons. Résultat:

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

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

Répondre

6

Il est appelé une jointure externe complète et il est pas pris en charge en mode natif dans MySQL, à en juger de son docs. Vous pouvez contourner cette limitation en utilisant UNION comme décrit dans les commentaires sur la page à laquelle je suis lié.

[edit] Puisque d'autres ont posté des extraits, c'est parti. Vous pouvez voir une 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 
2

Pourrait faire avec un peu de travail, mais voici quelques 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 retourne toutes les lignes de la table d'origine (dans ce cas, c'est la table subselect T). S'il n'y a pas de correspondance dans la table jointe, la colonne sera définie sur NULL.

-1

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 
+0

La question indique explicitement MySQL – cdeszaq