• 全部
  • Oracle 基础和管理
  • Oracle 高级技术
  • Oracle 认证与考试
  • 职位交流
  • 问答

关于数据查询[非常棘手]的一个问题请大家帮忙解决!!!在线急等!!!

envenlope 2008-07-04 05:45:19
现在有个要求:
有2个表A和B
A B
1 key 1 key
2 key 2 key
3 key 3 key
4
5
6 (日期)
7
8
9
10

要求A.1 = B.1 ,A.2 = B.4 ,A.3 = B.5 左连

如果A表对B表有多条数据的时候 取B.6中数据最大那条的纪录
现在有种情况就是B表的6(日期)字段中如果有相同的纪录的时候
要先按7,8,9,10的顺序降序排列 再取第一行

而且在SELECT的时候要取B表中的 7,8,9,10

在线急等,请各位高手解答,谢谢!!!


...全文
108 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yuyu1980 2008-07-07
可以先关联
select *
from {select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn
from b,a
where A.C1=b.C1 AND A.C2=b.C4 AND A.C3=b.C5(+))
wehre rn=1
回复
envenlope 2008-07-05
我明天还要加班 就先下了 谢谢yuyu1980 的帮助 明天一早我会还会上来看的

问题很紧急

我都晕了!
回复
envenlope 2008-07-05
我刚才上网查了下
是不是
表a,内容如下:
B C D
02 02 1
02 03 2
02 04 3
02 05 4
02 01 5
02 06 6
02 07 7
02 03 5
02 02 12
02 01 2
02 01 23

SELECT b, c, OVER(PARTITION BY b,c ORDER BY d) e FROM a
B C E
02 01 2
02 01 5
02 01 23
02 02 1
02 02 12
02 03 2
02 03 5
02 04 3
02 05 4
02 06 6
02 07 7


如果是这样 下面的假如是你写的子查询
SELECT b, c, row_number() OVER(PARTITION BY b,c ORDER BY d) e FROM a

然后外面在做 外面在做rn=1
结果:

B C E
02 01 2

02 02 1

02 03 2

02 04 3
02 05 4
02 06 6
02 07 7

也就是说row_number() 是去掉PARTITION BY 后面相同的字段 b,c 有相同的 就去掉?

然后你在rn=1 就是取每个组中的第一条记录

不知道我的理解股对不对?
回复
envenlope 2008-07-05
我现在想到的是能不用 decode函数做个判断 但是怎么加呢?
加的时候应该要影响到rn 的顺序 那就要加到 row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) 这里面吧
回复
envenlope 2008-07-05
yuyu1980 我刚才试了 你的方法好用

现在有2个问
1,select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn
from b 这样就是对所有的B表进行分组排序了。

我是不是可以在此加where和A表先连下
select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn
from b where A.1 = B.1 ,A.2 = B.4 ,A.3 = B.5
这样是不是会快点

2,要先按6,7,8,9的顺序降序排列 再取第一行

现在是如果 [B.7] 空或者NULL的时候就给这条记录放到最后一行

我是这么想的:
如果分组排序的时候[B.7]在此分组都为空或者NULL那么这个字段就应该在排序的时候不起作用了

如果分组排序的时候[B.7]在此分组的时候就有一条记录有值那么这条记录一定是排在最前面了

如果分组排序的时候[B.7]在此分组的时候有多条记录忧值那么 就应该B.C6 DESC,B.C8 DESC,B.C9 DESC排序

请问这样的话如何改这个SQL?
回复
envenlope 2008-07-05
我先试试你的方法
回复
yuyu1980 2008-07-05
select *
from a,(select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn
from b) c
where A.C1=c.C1 AND A.C2=c.C4 AND A.C3=c.C5(+) and c.rn=1

--将b表以b.c1,b.c4,b.c5 分组排序,即只要b.c1,b.c4,b.c5 相同 那么rn就会是 1 2 3 ...
select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC

--c.rn=1 就是只取第一条,不知道你想要的是不是这个结果
select *
from a,(select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn
from b) c
where A.C1=c.C1 AND A.C2=c.C4 AND A.C3=c.C5(+) and c.rn=1




回复
envenlope 2008-07-04
按6,7,8,9的顺序降序排列 再取第一行

问题谢的有问题 不好意思

如果这样 yuyu1980 程序是不是这样

select *
from a,(select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn
from b) c
where A.C1=c.C1 AND A.C2=c.C4 AND A.C3=c.C5(+) and c.rn=1


就不用C10 DESC排序了?

还有c.rn=1 这样不就是只能出子表C中的第一条了吗?

第一次用oracle 有很多不明白的地方望指导

谢谢
回复
yuyu1980 2008-07-04
select *
from a,(select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC,B.C10 DESC) rn
from b) c
where A.C1=c.C1 AND A.C2=c.C4 AND A.C3=c.C5(+) and c.rn=1
回复
envenlope 2008-07-04
A 表
1 key
2 key
3 key


B 表
1 key
2 key
3 key
4
5
6 (日期)
7
8
9
10


以上是表的结构 上面的可能排版有问题
回复
envenlope 2008-07-04
A B
1 key 1 key
2 key 2 key
3 key 3 key
4
5
6 (日期)
7
8
9
10
回复
envenlope 2008-07-04
首先谢谢楼上的回答
第一能不能不用视图实现
第二就有2个表 A表也没有那么多的字段

A B
1 key 1 key
2 key 2 key
3 key 3 key
4
5
6 (日期)
7
8
9
10
回复
shuchangjun 2008-07-04
写错了.
以下建视图
select a.1,a.2,a.3,a.4,a.5,a.6,a.7,a.8 from a,b,c wher a.1=b.1(+) and b.1=c.1(+)
order by a.1,a.2,a.3,b.6 desc ,a.6 desc,a.7 desc,a.8 desc

然后
select * from 视图名 where rowid in (select rid from (select rowid rid,row_number() over(partition by a.1,a.2,a.3 order by rowid) rn
from 视图名 ) where rn =1 );
回复
shuchangjun 2008-07-04
以下建视图
select a.1,a.2,a.3,a.4,a.5,a.6,a.7,a.8 from a,b,c wher a.1=b.1(+) and b.1=c.1(+)
order by a.1,a.2,a.3,b.6 desc ,a.6 desc,a.7 desc,a.8 desc

然后
select * from 视图名 where rowid in (select rid from (select rowid rid,row_number() over(partition by a.1,a.2,a.3 order by rowid) rn
from 视图名 ) where rn <> 1 );

回复
相关推荐
发帖
Oracle
创建于2007-09-28

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2008-07-04 05:45
社区公告
暂无公告