ROW_NUMBER()和ROWNUM组合使用

--目标:实现列上的子查询,因为列上的子查询条件与主表字段组合判断时,只能在第一层,如果嵌套第二层,就不能使用主表的字段作为判断条件了
/*
    这种情况可以正常查询:
    select a.A1
        (select b.B1 from TableB b where b.B2=a.A2) AName
    from TableA a
    下面这种情况就不能查询了:
    select a.A1
        (select B1 from(
            select b.B1 from TableB b where b.B2=a.A2 order by b.B3
        ) where ROWNUM=1) AName
    from TableA a
    也就是说:b.B2=a.A2只能放在第一层括号中
*/
--带条件的原始数据,其实还有一条数据 POVI_VISITS_DATE = 2012-12-31。原始数据结果见最下方图。
SELECT POVI_VISITS_DATE from
    (select POVI_VISITS_DATE, POVI_WOMA_ID from postpartumvisits) a
where a.POVI_WOMA_ID=1678526 and a.POVI_VISITS_DATE>to_date('2013-01-01','yyyy-MM-dd')
/
--场景:实现取2013-01-01以后的第一条数据,放于与列上
--方式一:可以实现,且代码简洁:rnum看上去没有明显作用,但是去掉查询结果则是2013-01-07,与正常结果不符。rnum的实际作用是以简洁的方式替代了order by,避免了多层嵌套.注意,因为列上只能查询一个字段,所以rnum不能放在查询列上,但可以作为查询条件上。
SELECT POVI_VISITS_DATE from
    (select POVI_VISITS_DATE, POVI_WOMA_ID, ROW_NUMBER() over (partition by POVI_WOMA_ID order by POVI_VISITS_DATE asc) rnum from postpartumvisits) a
where a.POVI_WOMA_ID=1678526 and a.POVI_VISITS_DATE>to_date('2013-01-01','yyyy-MM-dd') and ROWNUM=1 and rnum>0
/
--方式二:嵌套太多,放于列上会报错
select POVI_VISITS_DATE from (
      SELECT POVI_VISITS_DATE from
          (select POVI_VISITS_DATE, POVI_WOMA_ID from postpartumvisits) a
      where a.POVI_WOMA_ID=1678526 and a.POVI_VISITS_DATE>to_date('2013-01-01','yyyy-MM-dd')
      order by POVI_VISITS_DATE asc
)where ROWNUM=1
/
--方式三:强制把条件放在外层,与业务不符;如果把条件放于内层查询,就想方式二一样,查询报错
SELECT POVI_VISITS_DATE,rnum from
    (select POVI_VISITS_DATE, POVI_WOMA_ID, ROW_NUMBER() over (partition by POVI_WOMA_ID order by POVI_VISITS_DATE asc) rnum from postpartumvisits) a
where a.POVI_WOMA_ID=1678526 and a.POVI_VISITS_DATE>to_date('2013-01-01','yyyy-MM-dd') --and rnum=1

原始数据查询结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值