2009-05-13 8 views
1

OK, donc j'ai deux tables (vues en réalité) qui ont toutes les deux la même structure. Chacun a une colonne avec une date et une colonne avec une valeur numérique.Comment fusionner deux listes se chevauchant partiellement dans MySQL?

Les dates dans les deux tableaux seront presque continues et couvriront la même période. Les données seront par conséquent en grande partie les mêmes, mais une date dans une table peut ne pas apparaître dans l'autre.

Je veux avoir une table, avec une colonne de date et deux colonnes numériques. Lorsqu'il n'y a pas de date dans une table, le champ numérique correspondant devrait être nul.

Toutes les approches là-bas?


PS Ce n'est pas la même question: How can I merge two MySQL tables?

Répondre

2

solution de VladiatOr peut être raccourci en ayant la première partie de sélection des enregistrements présents dans les deux, et seulement dans le premier tableau, puis en ajoutant ceux qui sont présents seulement dans la seconde table.

SELECT t1.td, t1.val as val1, t2.val as val2 
    FROM table1 as t1 
    LEFT JOIN table2 as t2 
    ON t1.td = t2.td 
UNION 
SELECT t2.td, t1.val as val1, t2.val as val2 
    FROM table2 as t2 
    LEFT JOIN table1 as t1 
    ON t2.td = t1.td 
WHERE t1.td IS NULL 

Voir aussi le commentaire de Tobias Riemenschneider dans le MySQL Reference on JOIN Syntax.

+0

Bon appel, fonctionne comme un charme. J'ai maintenant une collection de vues épique ... =) –

1

Cette requête est une union de 3 requêtes: Le premier joint les dossiers qui sont communs dans les deux tableaux. La seconde ajoute celles qui n'existent que dans la table1. Le troisième ajoute les enregistrements qui sont uniquement dans la table2.

SELECT t1.td, t1.val as val1, t2.val as val2 
FROM table1 as t1, table2 as t2 
WHERE t1.dt = t2.dt 
UNION 
SELECT t1.td, t1.val as val1, null as val2 
FROM table1 as t1 
LEFT JOIN table2 as t2 
ON t1.td = t2.td 
WHERE t2.td IS NULL 
UNION 
SELECT t2.td, null as val1, t2.val as val2 
FROM table2 as t2 
LEFT JOIN table1 as t1 
ON t2.td = t1.td 
WHERE t1.td IS NULL 
Questions connexes