воссоединение двух столов - PullRequest
0 голосов
/ 13 сентября 2011
Create table tbl_test(
    col1 nvarchar(255),
    col2 nvarchar(255),
    sum1 int,
    sum2 int,
    sum3 int)

Create table tbl_test2(
    col1 nvarchar(255),
    col2 nvarchar(255),
    sum1 int,
    sum2 int,
    sum3 int)

Insert into tbl_test (col1, col2, sum1, sum2, sum3)
    select 'a','a',  1 , 1 ,1
        union all
    select 'a','b', 2,2,2
        union all
    select 'a','c', 3,3,3   

Insert into tbl_test2 (col1, col2, sum1, sum2, sum3)
    select 'a','a',  1 , 1 ,1
        union all
    select 'a','b', 2,2,2
        union all
    select 'b','a', 3,3,3   

/ ** * 1002 Я хотел бы, чтобы моя процедура получила новую таблицу tbl_result:

tbl_result:
    col1 | col2 | sum1 | sum2 | sum3
     'a'    'a'     2      2     2      || 1 + 1 
     'a'    'b'     4      4     4
     'a'    'c'     3      3     3
     'b'    'a'     3      3     3

* / - Так что я хотел бы провести какое-то воссоединение между двумя столами.

- Метод, который я нашел до сих пор:

- Шаг 1: найти общие значения

Update a 
    set a.sum1 = a.sum1 + b.sum1,
        a.sum2 = a.sum2 + b.sum2,
        a.sum3 = a.sum3 + b.sum3 
from tbl_test a join tbl_test2 b on a.col1 = b.col1 and a.col2 = b.col2

- Шаг 2: найти новые значения

Insert into  tbl_test (col1, col2 ,sum1,sum2,sum3)
    select 
            b.col1,
            b.col2,
            b.sum1,
            b.sum2,
            b.sum3
    from tbl_test a right join tbl_test2 b on a.col1 = b.col1 and a.col2 = b.col2
        where a.col1 is null and a.col2 is null

 select * from tbl_test

К сожалению, этого недостаточно. Если в моих таблицах 1 000 000 записей, объединение, вероятно, не является оптимальным решением. Есть идеи?

1 Ответ

1 голос
/ 13 сентября 2011

Вам нужно FULL JOIN и составной индекс в обеих таблицах на (col1, col2):

SELECT  COALESCE(a.col1, b.col1)                   AS col1
        COALESCE(a.col2, b.col2)                   AS col2
        COALESCE(a.sum1, 0) + COALESCE(b.sum1, 0)  AS sum1
        COALESCE(a.sum2, 0) + COALESCE(b.sum2, 0)  AS sum2
        COALESCE(a.sum3, 0) + COALESCE(b.sum3, 0)  AS sum3
FROM
    tbl_test a
  FULL JOIN
    tbl_test2 b
      ON  a.col1 = b.col1
      AND a.col2 = b.col2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...