2009-10-30 14 views
2

Можно ли обработать запрос, который добавляет значения в двух таблицах:Слить и добавить значения из двух таблиц

К примеру, у вас есть две таблицы

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

и

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

Затем, когда вы добавляете «две таблицы», вы получите результат, где совпадение идентификатора. Итак, a = 1 + 1 = 2, и просто тот же результат, когда они этого не делают. Таким образом, запрос будет возвращать:

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

ответ

5

может быть что-то вроде

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

Я думаю, что вы могли бы хотеть полное внешнее соединение вместо соединения слева –

+0

я думаю, что ты прав –

2

Использование:

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

Вы могли бы сделать это так, - но другие ответы, вероятно, стремительнее:

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 

ИЛИ

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 

Нет группировка или что-нибудь. Он обрабатывает следующие случаи: если идентификатор находится в T1, но не в T2, вы получите значение в T1 и наоборот. Это управляет двунаправленным включением.

Если идентификатор находится в обоих вы получите сумму

+0

Я думаю, что вы найдете ISNULL быстрее на индексируется данных, чем COALESCE. Должно было положить это в качестве причины для этого сообщения – TerrorAustralis