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递归查询
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递归查询
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递归查询
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
)
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
最后是要合并数据的
#12
这个你需要用存储过程来做。
#13
请指教
#14
用游标?
#15
或者用外部程序从视图离取数,做合并
#16
高手请进。
#17
还是看不太明白~~
#18
高手请进呀。
#19
简单地说,查询结果
50 w
30 vf
楼主要变成1行:
50 w 30 vf
DB2没有MYSQL的GROUP_CONCAT之类的函数,用游标打开记录集,循环、累加字符串
#20
那我看他的目的只是为了合并数据 前面说的视图是浮云来着。 DB2确实是没有类似函数
#21
也就是说db2无法完成此业务要求了,有的说用游标,请指教。
#22
游标适用范围UDF SP 需要自己开发
#23
怎么办。
#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
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
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
能运行么?
#27
没有测试,只是 给你一个示例、思路,自己动手做一下吧,有问题再问
#28
我用的是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
这里有两个资料: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
看了半天没看懂,看来我的sql能力太差了。
#33
看看DB2的HELP,动手做一下吧,有问题再问
#34
我这两天就解决这问题了,我是实现了一个,但速度太慢,4000多条记录,十几秒这速度不理想,所以才想。。。。
#35
唉
#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递归查询
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递归查询
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递归查询
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
)
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
最后是要合并数据的
#12
这个你需要用存储过程来做。
#13
请指教
#14
用游标?
#15
或者用外部程序从视图离取数,做合并
#16
高手请进。
#17
还是看不太明白~~
#18
高手请进呀。
#19
简单地说,查询结果
50 w
30 vf
楼主要变成1行:
50 w 30 vf
DB2没有MYSQL的GROUP_CONCAT之类的函数,用游标打开记录集,循环、累加字符串
#20
那我看他的目的只是为了合并数据 前面说的视图是浮云来着。 DB2确实是没有类似函数
#21
也就是说db2无法完成此业务要求了,有的说用游标,请指教。
#22
游标适用范围UDF SP 需要自己开发
#23
怎么办。
#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
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
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
能运行么?
#27
没有测试,只是 给你一个示例、思路,自己动手做一下吧,有问题再问
#28
我用的是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
这里有两个资料: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
看了半天没看懂,看来我的sql能力太差了。
#33
看看DB2的HELP,动手做一下吧,有问题再问
#34
我这两天就解决这问题了,我是实现了一个,但速度太慢,4000多条记录,十几秒这速度不理想,所以才想。。。。
#35
唉
#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语句,就是有点慢,求速度。