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?
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! –
@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')? –
@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! –