数据查询,求效率更高的方法。

christy_fang 2012-01-11 09:37:19
主表:a
id name did(部门id)
101 test1 1
102 test2 2
103 test3 1

附表:b (a表id每个月都有一条数据)
aid date month value
101 2011-1-1 1 111
101 2011-2-1 2 222
102 2011-1-1 1 1212
102 2011-2-1 2 2121
103 2011-1-1 1 1313
103 2011-2-1 2 2323

我现在要查询所有部门id为1的数据,并且时间范围从2011年1月到2011年5月,但是现在库里只有1月和2月的数据,所以我查询出来的结果也是只有1月和2月的数据,但是我想要的结果是,1-5月的数据都有,如果该月的数据在数据库中没有用空或0代替,如下:
101 test1 2011-1-1 1 111
101 test1 2011-2-1 2 222
101 test1 2011-3-1 3 0
101 test1 2011-4-1 4 0
101 test1 2011-5-1 5 0
103 test3 2011-1-1 1 1313
103 test3 2011-2-1 2 2323
103 test3 2011-3-1 3 0
103 test3 2011-4-1 4 0
103 test3 2011-5-1 5 0

我目前想到的方法是,用时间来循环,一个个查,但是貌似这样相率不高,so~ 求方法更好、效率更高的写法,还请各位帮忙!

我写的是存储过程,
...全文
141 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
christy_fang 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 geniuswjt 的回复:]

...你再研究下,都提示到这步了,就把生成的t表换一下不就完事了么?
根据你传的开始和结束时间生成个连续时间表,其他同理?
动动脑。
引用 7 楼 christy_fang 的回复:
这样要怎么写呢?
[/Quote]
单年1-12月份的时间表能弄出来,可是多年的就弄不出来了,就是从2008年1月一直到2011年12月,想不到办法,帮忙想想吧。
geniuswjt 2012-01-11
  • 打赏
  • 举报
回复
...你再研究下,都提示到这步了,就把生成的t表换一下不就完事了么?
根据你传的开始和结束时间生成个连续时间表,其他同理?
动动脑。
[Quote=引用 7 楼 christy_fang 的回复:]
这样要怎么写呢?
[/Quote]
christy_fang 2012-01-11
  • 打赏
  • 举报
回复
这样要怎么写呢?
christy_fang 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 geniuswjt 的回复:]

我举个例子好了
SQL code

--生成测试数据
create table w_testA(
id number,
name varchar2(20),
did number
);

insert into w_testA values(101,'test1',1);
insert into w_testA values(102,'test2',2);
insert into w_te……
[/Quote]
嗯嗯,这样可以,但是还木有完全理解,还有就是这只是根据一个时间来的,那如果我要根据两个时间来呢
比如参数值是(我写的是存储过程嘛),开始年、结束年、开始月、结束月=2008、2011、1、12
意思是查询2008年至2011年 1月至12月的数据
geniuswjt 2012-01-11
  • 打赏
  • 举报
回复
话说LZ真喜欢用关键字做列名,建议改掉这个习惯,否则可能引起不必要的麻烦
geniuswjt 2012-01-11
  • 打赏
  • 举报
回复
我举个例子好了

--生成测试数据
create table w_testA(
id number,
name varchar2(20),
did number
);

insert into w_testA values(101,'test1',1);
insert into w_testA values(102,'test2',2);
insert into w_testA values(103,'test3',1);

create table w_testB(
aid number,
"date" varchar2(10),
month number,
value number
);

insert into w_testB values(101,'2011-1-1',1,111 );
insert into w_testB values(101,'2011-2-1',2,222 );
insert into w_testB values(102,'2011-1-1',1,1212);
insert into w_testB values(102,'2011-2-1',2,2121);
insert into w_testB values(103,'2011-1-1',1,1313);
insert into w_testB values(103,'2011-2-1',2,2323);

commit;

--开始查询
select a.id,a.name,t.dd,t.mm,nvl(b.value,0) value from (
select rownum mm,'2011-'||rownum||'-1' dd from user_objects where rownum<=5
) t cross join w_testA a
left join w_testB b on (t.mm=b.month and a.id=b.aid)
where a.did=1
order by a.id,t.mm;

/*
ID NAME DD MM VALUE
101 test1 2011-1-1 1 111
101 test1 2011-2-1 2 222
101 test1 2011-3-1 3 0
101 test1 2011-4-1 4 0
101 test1 2011-5-1 5 0
103 test3 2011-1-1 1 1313
103 test3 2011-2-1 2 2323
103 test3 2011-3-1 3 0
103 test3 2011-4-1 4 0
103 test3 2011-5-1 5 0
*/

--结束查询
drop table w_testA;
drop table w_testB;
[Quote=引用 1 楼 geniuswjt 的回复:]
构造个时间表left join就好了哇。
[/Quote]
minitoy 2012-01-11
  • 打赏
  • 举报
回复
用connect by构造时间表,然后left join
christy_fang 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 geniuswjt 的回复:]

构造个时间表left join就好了哇。
[/Quote]
这个时间是动态的,由java后台传过来的,指不定是从哪年哪月到哪年哪月
geniuswjt 2012-01-11
  • 打赏
  • 举报
回复
构造个时间表left join就好了哇。
zenglinyeah 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 geniuswjt 的回复:]
话说LZ真喜欢用关键字做列名,建议改掉这个习惯,否则可能引起不必要的麻烦
[/Quote]

我也是 因此同感

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧