2011-09-13 3 views
0
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 

/*
Ce que je voudrais que ma procédure à faire est d'obtenir une nouvelle table tbl_result:réunion de deux tables

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 

*/ -SO Je voudrais avoir une sorte de réunion entre les 2 tables.

--Le méthode que je trouve à ce jour est:

- Étape 1: trouvez les valeurs communes

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 

- Étape 2: trouver les nouvelles valeurs

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 

Malheureusement, ce n'est pas assez bon. Si mes tables ont 1.000.000 enregistrements, une jointure n'est probablement pas une solution optimale. Des idées?

+1

Si vos tables ont les indices appropriés, même 100 millions ** lignes ** (tables de base de données ont des lignes ** ** - pas d'enregistrements) sont ** PAS ** un problème! –

+0

@marc_s: Pouvez-vous commenter ma réponse, s'il vous plaît? Est-ce que le 'COALESCE()' sur des millions de lignes sera lent, devrait-il être réécrit comme UNION de 3 JOINS ('INNER' +' LEFT-IS NULL' + 'RIGHT-IS NULL')? –

+0

@ypercube: J'ai entendu des opinions très différentes sur 'COALESCE' et honnêtement, je n'ai jamais eu l'occasion de le tester moi-même sur un ensemble de données suffisamment important - donc je ne peux pas vraiment le dire. Mais l'index composé sur les deux tableaux est ** certainement ** un must! –

Répondre

1

Vous avez besoin d'un FULL JOIN et un indice composé dans les deux tables sur (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