--目标:实现列上的子查询,因为列上的子查询条件与主表字段组合判断时,只能在第一层,如果嵌套第二层,就不能使用主表的字段作为判断条件了
/*
这种情况可以正常查询:
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
原始数据查询结果: