2009-10-30 7 views
2

Est-il possible de concevoir une requête qui ajoute des valeurs dans les deux tableaux:Fusion et ajouter des valeurs à partir de deux tables

Par exemple, supposons que vous avez deux tables

id value 
-- ----- 
a  1 
c  2 
d  3 
f  4 
g  5 

et

id  value 
--  ----- 
a  1 
b  2 
c  3 
d  4 
e  5 

Ensuite, lorsque vous 'ajoutez' les deux tables, vous obtenez le résultat correspondant à l'ID. Donc, a = 1 + 1 = 2, et simplement le même résultat où ils ne le font pas. Ainsi, la requête retournerait:

id  value 
--  ----- 
a  2 
b  2 
c  5 
d  7 
e  5 
f  4 
g  5 

Répondre

5

peut-être quelque chose comme

select coalesce(t1.id, t2.id) as id, (coalesce(t1.value, 0) + coalesce(t2.value, 0)) as value 
from table1 t1 full outer join table2 t2 on t1.id = t2.id 
+0

Je pense que vous voudrez peut-être une jointure externe au lieu d'une jointure gauche –

+0

je pense que vous avez raison –

2

Utilisation:

SELECT x.id, 
     SUM(x.value) 
    FROM (SELECT t.id, 
       t.value 
      FROM TABLE_1 t 
      UNION ALL 
      SELECT t2.id, 
       t2.value 
      FROM TABLE_2 t2) x 
GROUP BY x.id 
1

Vous pouvez le faire comme ça - mais les autres réponses sont probablement plus rapide:

SELECT t1.id, t1.value + t2.value AS value 
    FROM t1 INNER JOIN t2 ON t1.id = t2.id 
UNION 
SELECT t1.id, t1.value 
    FROM t1 
WHERE t1.id NOT IN (SELECT t2.id FROM t2) 
UNION 
SELECT t2.id, t2.value 
    FROM t2 
WHERE t2.id NOT IN (SELECT t1.id FROM t1) 
0
SELECT 
    COALESCE(t1.id, t2.id) AS id, 
    COALESCE(t1.value, 0) + COALESCE(t2.value, 0) AS value 
FROM 
    t1 
    FULL OUTER JOIN 
    t2 ON t1.id = t2.id 

OU

SELECT 
    foo.id, 
    COALESCE(t1.value, 0) + COALESCE(t2.value, 0) AS value 
FROM 
    (
    SELECT t1.id FROM t1 
    UNION 
    SELECT t2.id FROM t2 
    ) foo 
    LEFT JOIN 
    t1 ON foo.id = t1.id 
    LEFT JOIN 
    t2 ON foo.id = t2.id 
0
SELECT ISNULL(T1.Col1.T2.Col1) as ID, (ISNULL(T1.Col2,0) + ISNULL(T2.Col2,0)) as SumCols 
FROM T1 OUTER JOIN T2 ON T1.Col1 = T2.Col2 

Aucun groupe ou quoi que ce soit. Il gère les cas suivants

si un identificateur est dans T1 mais pas dans T2, vous obtiendrez la valeur dans T1 et vice versa. Ceci gère l'inclusion bidirectionnelle.

Si un ID est à la fois, vous obtenez la somme

+0

Je pense que vous trouverez ISNULL est plus rapide sur indexé données que COALESCE. Aurait dû mettre cela comme une raison pour ce poste – TerrorAustralis

Questions connexes