db2 数据库 合并数据(只能高手进)

时间:2022-12-11 18:27:36
表1:test1
A  B  C
1  w  x
2  e  d
3  r  t
A为test1的主键
中间表test2
A  D  E
1  4  50
1  5  30
2  1  20
2  2  30
2  3  70
3  6  40
表test3
D  F  H
1  ws as
2  sa  
3  wq ew  
4  cd w
5  vf 
6  ew t
D为test3的主键
需求是通过test1中主键查询中间表test2两条数据:
A  D  E
1  4  50
1  5  30
再有中间表查询出test2的两条数据:
D  F  H  
4  cd w
5  vf
然后是合并数据,结果是:50 w 30 vf
这里还有条件:在查询出的test2中当H字段为空时才用F字段,
也就是结果:50 w 30 vf
最终结果放到一个视图里面test4
A       J    
1    50 w 30 vf   
就是这样,我也查了一些资料,有的说这样叫合并字段,很麻烦,请高手支招。

36 个解决方案

#1


你这些的是啥

#2


高手也看不懂,你这写的啥

#3


高手也看不懂,你这写的啥

#4


select *,case when c.h is null then c.f else c.h end 
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1

上述可以生成查询,如果记录要在一条记录上,则参考
http://database.51cto.com/art/201009/228856.htm

db2递归查询

#5


select *,case when c.h is null then c.f else c.h end 
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1

上述可以生成查询,如果记录要在一条记录上,则参考
http://database.51cto.com/art/201009/228856.htm

db2递归查询

#6


select *,case when c.h is null then c.f else c.h end 
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1

上述可以生成查询,如果记录要在一条记录上,则参考
http://database.51cto.com/art/201009/228856.htm

db2递归查询

#7


业务确实复杂了点,请高手不吝赐教。

#8


请高人指点。

#9


create view test4 as (
    select X.A, Y.E, case when Z.H is null then Z.F else Z.H end  
     from test1 X, test2 Y, test3 Z
    where X.A = Y.A and Y.D = Z.D and X.A = 1
)

#10


兄弟不知道是不是这样

#11


引用 9 楼 zhaojianmi1 的回复:
create view test4 as (
  select X.A, Y.E, case when Z.H is null then Z.F else Z.H end  
  from test1 X, test2 Y, test3 Z
  where X.A = Y.A and Y.D = Z.D and X.A = 1
)

最后是要合并数据的

#12


引用
最后是要合并数据的
这个你需要用存储过程来做。

#13


引用 12 楼 acmain_chm 的回复:
引用最后是要合并数据的这个你需要用存储过程来做。

请指教

#14


用游标?

#15


或者用外部程序从视图离取数,做合并

#16


高手请进。

#17


还是看不太明白~~

#18


高手请进呀。

#19


引用 17 楼 mr_bean 的回复:
还是看不太明白~~

简单地说,查询结果
50 w 
30 vf

楼主要变成1行:
50 w 30 vf
DB2没有MYSQL的GROUP_CONCAT之类的函数,用游标打开记录集,循环、累加字符串

#20


那我看他的目的只是为了合并数据 前面说的视图是浮云来着。 DB2确实是没有类似函数 

#21


引用 20 楼 mr_bean 的回复:
那我看他的目的只是为了合并数据 前面说的视图是浮云来着。 DB2确实是没有类似函数

也就是说db2无法完成此业务要求了,有的说用游标,请指教。

#22


游标适用范围UDF SP 需要自己开发

#23


引用 19 楼 wwwwa 的回复:
引用 17 楼 mr_bean 的回复:
还是看不太明白~~

简单地说,查询结果
50 w 
30 vf

楼主要变成1行:
50 w 30 vf
DB2没有MYSQL的GROUP_CONCAT之类的函数,用游标打开记录集,循环、累加字符串

怎么办。

#24


简单示例
begin 

declare sqlcode integer default 0; 

declare n1 varchar(10); 
declare n2 varchar(10); 
declare n3 varchar(10); 
declare cursor1 cursor for select b.e,case when c.h is null then c.f else c.h end as newcol
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1 ; 

open cursor1; 

cursorLoop: 

loop 

fecth cursor1 into n1,n2 ; 
set n3=n1 || n2 

if sqlcode=100 then leave cursorLoop; 

end if; 

end loop; 

end;
返回N3

#25


简单示例
begin  

declare sqlcode integer default 0;  

declare n1 varchar(10);  
declare n2 varchar(10);  
declare n3 varchar(10);  
declare cursor1 cursor for select b.e,case when c.h is null then c.f else c.h end as newcol
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1 ;  
SET N3='';
open cursor1;  

cursorLoop:  

loop  

fecth cursor1 into n1,n2 ;  
set n3=N3 || n1 || n2  ;

if sqlcode=100 then leave cursorLoop;  

end if;  

end loop;  

end;
返回N3

#26


引用 25 楼 wwwwb 的回复:
简单示例
begin  

declare sqlcode integer default 0;  

declare n1 varchar(10);  
declare n2 varchar(10);  
declare n3 varchar(10);  
declare cursor1 cursor for select b.e,case when c.h is null th……

能运行么?

#27


没有测试,只是 给你一个示例、思路,自己动手做一下吧,有问题再问

#28


引用 27 楼 wwwwb 的回复:
没有测试,只是 给你一个示例、思路,自己动手做一下吧,有问题再问

我用的是DB2数据库,运行出错:
SQL0104N  在 "begin " 之后发现意外的标记 "declare"。期望的标记可能包括:"JOIN
<joined_table>"。  SQLSTATE=42601

#29


那个不是能直接运行的代码,呵呵

#30


如果谁那有db2数据库,请帮帮忙,三个表非常简单,我也一直在测试,真希望有高人出现,这个问题我感觉还是有它的业务价值的,特别是大型数据库,再有复杂的数据库表关系,我觉得这样的需求是有的,讲一个关系复杂的数据关系能够经过这样的操作放到视图里,我感觉很有必要,但也要考虑性能和查询的速度。
这里有两个资料:http://dev.firnow.com/course/7_databases/oracle/oraclejs/2008109/149366_2.html
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0510rielau/index.html

#31


上面都是高手,伪代码都给你写出来了

#32


引用 31 楼 zhaojianmi1 的回复:
上面都是高手,伪代码都给你写出来了

看了半天没看懂,看来我的sql能力太差了。

#33


看看DB2的HELP,动手做一下吧,有问题再问

#34


引用 33 楼 wwwwb 的回复:
看看DB2的HELP,动手做一下吧,有问题再问

我这两天就解决这问题了,我是实现了一个,但速度太慢,4000多条记录,十几秒这速度不理想,所以才想。。。。

#35


db2 数据库 合并数据(只能高手进)db2 数据库 合并数据(只能高手进)db2 数据库 合并数据(只能高手进)

#36



(code,desc,name_english,yarn_count,special_yarn_flag,code_sys,sp_valid_status_id) as  with t (t1,t2,t3) as ( select a.code,a.yarn_count,rtrim(char(int(b.percentage)))||'%' || ' ' || case  when  c.name_chinese = '' or c.name_chinese is null  then c.name_english  else c.name_chinese end name  from sp_yarn a left join sp_yarn_tree b on a.sp_yarn_id = b.sp_yarn_id left join sp_yarn_content c on c.sp_yarn_content_id = b.sp_yarn_content_id  ), t1(t11,t22,t33,t44,t55) as ( select t1,t2,t3,rownumber() over(partition by t1,t2),rownumber() over(partition by t1,t2) as t4 from t )  , t3(s1,s2,s3,s4,s5) as( select t11,t22,cast(t33 as varchar(100)),t44,t55 from t1 where T44 =1 and t55=1 union all select a.s1,a.s2,cast(a.s3||' '||b.t33 as varchar(100)),a.s4+1,a.s5 from t3 a,t1 b where a.s1=b.t11 and a.s2 = b.t22 and a.s4 = b.t55-1) select s1 code,s2||' '||s3 desc,cc.name_english,cc.yarn_count,cc.special_yarn_flag,cc.code_sys ,cc.sp_valid_status_id from t3 x  join sp_yarn cc on cc.code = x.s1 where x.s4=(select max(s4) from t3 y where x.s1=y.s1 and x.s2 = y.s2)

这是我实际业务的sql语句,就是有点慢,求速度。

#1


你这些的是啥

#2


高手也看不懂,你这写的啥

#3


高手也看不懂,你这写的啥

#4


select *,case when c.h is null then c.f else c.h end 
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1

上述可以生成查询,如果记录要在一条记录上,则参考
http://database.51cto.com/art/201009/228856.htm

db2递归查询

#5


select *,case when c.h is null then c.f else c.h end 
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1

上述可以生成查询,如果记录要在一条记录上,则参考
http://database.51cto.com/art/201009/228856.htm

db2递归查询

#6


select *,case when c.h is null then c.f else c.h end 
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1

上述可以生成查询,如果记录要在一条记录上,则参考
http://database.51cto.com/art/201009/228856.htm

db2递归查询

#7


业务确实复杂了点,请高手不吝赐教。

#8


请高人指点。

#9


create view test4 as (
    select X.A, Y.E, case when Z.H is null then Z.F else Z.H end  
     from test1 X, test2 Y, test3 Z
    where X.A = Y.A and Y.D = Z.D and X.A = 1
)

#10


兄弟不知道是不是这样

#11


引用 9 楼 zhaojianmi1 的回复:
create view test4 as (
  select X.A, Y.E, case when Z.H is null then Z.F else Z.H end  
  from test1 X, test2 Y, test3 Z
  where X.A = Y.A and Y.D = Z.D and X.A = 1
)

最后是要合并数据的

#12


引用
最后是要合并数据的
这个你需要用存储过程来做。

#13


引用 12 楼 acmain_chm 的回复:
引用最后是要合并数据的这个你需要用存储过程来做。

请指教

#14


用游标?

#15


或者用外部程序从视图离取数,做合并

#16


高手请进。

#17


还是看不太明白~~

#18


高手请进呀。

#19


引用 17 楼 mr_bean 的回复:
还是看不太明白~~

简单地说,查询结果
50 w 
30 vf

楼主要变成1行:
50 w 30 vf
DB2没有MYSQL的GROUP_CONCAT之类的函数,用游标打开记录集,循环、累加字符串

#20


那我看他的目的只是为了合并数据 前面说的视图是浮云来着。 DB2确实是没有类似函数 

#21


引用 20 楼 mr_bean 的回复:
那我看他的目的只是为了合并数据 前面说的视图是浮云来着。 DB2确实是没有类似函数

也就是说db2无法完成此业务要求了,有的说用游标,请指教。

#22


游标适用范围UDF SP 需要自己开发

#23


引用 19 楼 wwwwa 的回复:
引用 17 楼 mr_bean 的回复:
还是看不太明白~~

简单地说,查询结果
50 w 
30 vf

楼主要变成1行:
50 w 30 vf
DB2没有MYSQL的GROUP_CONCAT之类的函数,用游标打开记录集,循环、累加字符串

怎么办。

#24


简单示例
begin 

declare sqlcode integer default 0; 

declare n1 varchar(10); 
declare n2 varchar(10); 
declare n3 varchar(10); 
declare cursor1 cursor for select b.e,case when c.h is null then c.f else c.h end as newcol
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1 ; 

open cursor1; 

cursorLoop: 

loop 

fecth cursor1 into n1,n2 ; 
set n3=n1 || n2 

if sqlcode=100 then leave cursorLoop; 

end if; 

end loop; 

end;
返回N3

#25


简单示例
begin  

declare sqlcode integer default 0;  

declare n1 varchar(10);  
declare n2 varchar(10);  
declare n3 varchar(10);  
declare cursor1 cursor for select b.e,case when c.h is null then c.f else c.h end as newcol
from test1 a left join test2 b on a.a=b.a
left join test3 c on c.d=b.d
where a.A=1 ;  
SET N3='';
open cursor1;  

cursorLoop:  

loop  

fecth cursor1 into n1,n2 ;  
set n3=N3 || n1 || n2  ;

if sqlcode=100 then leave cursorLoop;  

end if;  

end loop;  

end;
返回N3

#26


引用 25 楼 wwwwb 的回复:
简单示例
begin  

declare sqlcode integer default 0;  

declare n1 varchar(10);  
declare n2 varchar(10);  
declare n3 varchar(10);  
declare cursor1 cursor for select b.e,case when c.h is null th……

能运行么?

#27


没有测试,只是 给你一个示例、思路,自己动手做一下吧,有问题再问

#28


引用 27 楼 wwwwb 的回复:
没有测试,只是 给你一个示例、思路,自己动手做一下吧,有问题再问

我用的是DB2数据库,运行出错:
SQL0104N  在 "begin " 之后发现意外的标记 "declare"。期望的标记可能包括:"JOIN
<joined_table>"。  SQLSTATE=42601

#29


那个不是能直接运行的代码,呵呵

#30


如果谁那有db2数据库,请帮帮忙,三个表非常简单,我也一直在测试,真希望有高人出现,这个问题我感觉还是有它的业务价值的,特别是大型数据库,再有复杂的数据库表关系,我觉得这样的需求是有的,讲一个关系复杂的数据关系能够经过这样的操作放到视图里,我感觉很有必要,但也要考虑性能和查询的速度。
这里有两个资料:http://dev.firnow.com/course/7_databases/oracle/oraclejs/2008109/149366_2.html
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0510rielau/index.html

#31


上面都是高手,伪代码都给你写出来了

#32


引用 31 楼 zhaojianmi1 的回复:
上面都是高手,伪代码都给你写出来了

看了半天没看懂,看来我的sql能力太差了。

#33


看看DB2的HELP,动手做一下吧,有问题再问

#34


引用 33 楼 wwwwb 的回复:
看看DB2的HELP,动手做一下吧,有问题再问

我这两天就解决这问题了,我是实现了一个,但速度太慢,4000多条记录,十几秒这速度不理想,所以才想。。。。

#35


db2 数据库 合并数据(只能高手进)db2 数据库 合并数据(只能高手进)db2 数据库 合并数据(只能高手进)

#36



(code,desc,name_english,yarn_count,special_yarn_flag,code_sys,sp_valid_status_id) as  with t (t1,t2,t3) as ( select a.code,a.yarn_count,rtrim(char(int(b.percentage)))||'%' || ' ' || case  when  c.name_chinese = '' or c.name_chinese is null  then c.name_english  else c.name_chinese end name  from sp_yarn a left join sp_yarn_tree b on a.sp_yarn_id = b.sp_yarn_id left join sp_yarn_content c on c.sp_yarn_content_id = b.sp_yarn_content_id  ), t1(t11,t22,t33,t44,t55) as ( select t1,t2,t3,rownumber() over(partition by t1,t2),rownumber() over(partition by t1,t2) as t4 from t )  , t3(s1,s2,s3,s4,s5) as( select t11,t22,cast(t33 as varchar(100)),t44,t55 from t1 where T44 =1 and t55=1 union all select a.s1,a.s2,cast(a.s3||' '||b.t33 as varchar(100)),a.s4+1,a.s5 from t3 a,t1 b where a.s1=b.t11 and a.s2 = b.t22 and a.s4 = b.t55-1) select s1 code,s2||' '||s3 desc,cc.name_english,cc.yarn_count,cc.special_yarn_flag,cc.code_sys ,cc.sp_valid_status_id from t3 x  join sp_yarn cc on cc.code = x.s1 where x.s4=(select max(s4) from t3 y where x.s1=y.s1 and x.s2 = y.s2)

这是我实际业务的sql语句,就是有点慢,求速度。