z********4 发帖数: 1668 | 1 有48张表,每个表有一个id字段(建立了unique idex),一个value字段:
表1的字段:id, value1
表2的字段:id, value2
表3的字段,id, value3
……
表48的字段:id, value48
现在希望把这48张表根据id字段合并为一张,结构为:
id, value1, value2, value3,...,value48
问题是,每个表记录的id并不完全一样,表1中有的id表2中可能没有,反之亦然。但是
要求保留所有在48张表中出现过的id。如果这个id在表x中不存在,那么合并后的总表
中,这个id的valuex字段赋一个-1值。
例如,总表可能是这样的:
id, value1, value2, value3,...,value48
a, 1, 2, 3, ..., -1
b, 2, -1, 3, .... 3
...
另外一个问题是,每个表都非常大,记录数量在1200w左右。
数据库为postgresql,求好的解决方案。感谢! | i*******d 发帖数: 81 | 2 CTE + 一串 left outer join 可以实现。
SQL Server 三个table:
create table t1( id int, value1 int);
create table t2( id int, value2 int);
create table t3( id int, value3 int);
insert into t1 values (2,2),(3,3);
insert into t2 values (1,1),(3,3);
insert into t3 values (1,1),(2,2);
with idtable as
(select id from (select id from t1 union select id from t2 union
select id from t3) as t)
select idtable.id,isnull(value1,-1) as value1, isnull(value2,-1) as value2,
isnull(value3,-1) as value3
from idtable left outer join t1 on idtable.id = t1.id left outer join t2 on
idtable.id=t2.id left outer join t3 on idtable.id=t3.id;
Result:
id value1 value2 value3
1 -1 1 1
2 2 -1 2
3 3 3 -1
【在 z********4 的大作中提到】 : 有48张表,每个表有一个id字段(建立了unique idex),一个value字段: : 表1的字段:id, value1 : 表2的字段:id, value2 : 表3的字段,id, value3 : …… : 表48的字段:id, value48 : 现在希望把这48张表根据id字段合并为一张,结构为: : id, value1, value2, value3,...,value48 : 问题是,每个表记录的id并不完全一样,表1中有的id表2中可能没有,反之亦然。但是 : 要求保留所有在48张表中出现过的id。如果这个id在表x中不存在,那么合并后的总表
| i*******d 发帖数: 81 | 3 其实就两个column的表,12 million也不算大。最后的表不小。一下update 48 个
column可能要写挺长时间。
你可以先把最后表的结构create出来,先写进去所有的unique id,create index。然
后每次update一个column。
create table t1( id int, value1 int);
create table t2( id int, value2 int);
create table t3( id int, value3 int);
insert into t1 values (2,2),(3,3);
insert into t2 values (1,1),(3,3);
insert into t3 values (1,1),(2,2);
select id into final from (select id from t1 union select id from t2 union
select id from t3) as t;
create clustered index id on final(id);
alter table final add value1 int;
update final set value1 = isnull(t1.value1,-1) from final f left outer join
t1 on f.id = t1.id;
alter table final add value2 int;
update final set value2 = isnull(t2.value2,-1) from final f left outer join
t2 on f.id = t2.id;
alter table final add value3 int;
update final set value3 = isnull(t3.value3,-1) from final f left outer join
t3 on f.id = t3.id;
select * from final;
id value1 value2 value3
1 -1 1 1
2 2 -1 2
3 3 3 -1 | z********4 发帖数: 1668 | 4
高人……好难懂,我慢慢消化下,多谢!
【在 i*******d 的大作中提到】 : CTE + 一串 left outer join 可以实现。 : SQL Server 三个table: : create table t1( id int, value1 int); : create table t2( id int, value2 int); : create table t3( id int, value3 int); : insert into t1 values (2,2),(3,3); : insert into t2 values (1,1),(3,3); : insert into t3 values (1,1),(2,2); : with idtable as : (select id from (select id from t1 union select id from t2 union
| z********4 发帖数: 1668 | 5
这种做法也有道理。
【在 i*******d 的大作中提到】 : 其实就两个column的表,12 million也不算大。最后的表不小。一下update 48 个 : column可能要写挺长时间。 : 你可以先把最后表的结构create出来,先写进去所有的unique id,create index。然 : 后每次update一个column。 : create table t1( id int, value1 int); : create table t2( id int, value2 int); : create table t3( id int, value3 int); : insert into t1 values (2,2),(3,3); : insert into t2 values (1,1),(3,3); : insert into t3 values (1,1),(2,2);
| s**********o 发帖数: 14359 | 6 找出所有的UNIQUE ID,然后UPDATE你最后的表就是了,这不是一个
很简单的UPDATE的问题吗 | l*****e 发帖数: 3343 | 7 C#/powershell: a simple trick |
|