嵌套select语句时,如果内层select查询结果有重复列名,则外层无法用select *,如何解决

yoken 2003-10-16 02:46:53
我用oracle8i,在plsql里
select fl, bh, fl from dy_zd where fl='R2'能正确查出数据
但select a.*, rownum as rn from ( select fl, bh, fl from dy_zd where fl='R2') a报错:未明确定义列
而select a.*, rownum as rn from ( select fl, bh from dy_zd where fl='R2') a却可以执行
我用java,为了编程方便,通常内层select语句里有许多列,而且有重复列,但为了传参数方便,内层select语句以字符串的形式通过变量传递,传到别的地方后在其外部增加外层select语句,于是就出现了上述问题,如何在不改变内层有重复列select语句的情况下使得嵌套select语句正确执行
...全文
407 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoken 2003-10-19
  • 打赏
  • 举报
回复
我的意图是这样的:
原本我的查询是
sqlStr = "select a.*, b.bxgsmc, c.dwmc,a.bf1+a.bf2+a.bf3+a.bf4+a.bf5+a.bf6 as hj
from rc_bxdmx a, rc_bxgs b, jc_dwml c
where a.bxgsbh=b.bxgsbh and a.djh='111'
and substr(a.dwdm,1,length('100'))='100' and a.dwdm=c.dwdm";
其中a.*有30多个字段,但其中两个字段tbrq,jzrq为date类型,这种类型取到java环境里显示出来是连带小时分秒的,我想要的是YYYY-MM-DD的字符串,而在java里再做处理时要达到通用化就必须先判断字段的数据类型,增加了复杂性,所以采用oracle的to_char函数,于是查询语句写成
sqlStr2 = "select to_char(a.tbrq, 'YYYY-MM-DD') as tbrq, to_char(a.jzrq, 'YYYY-MM-DD') as jzrq, a.*, b.bxgsmc, c.dwmc,a.bf1+a.bf2+a.bf3+a.bf4+a.bf5+a.bf6 as hj
from rc_bxdmx a, rc_bxgs b, jc_dwml c
where a.bxgsbh=b.bxgsbh and a.djh='111'
and substr(a.dwdm,1,length('100'))='100' and a.dwdm=c.dwdm";
tbrq, jzrq都会取第一列
然而为了打印处理,
1、查询结果中不是所有的列都需要,用户会定义打印模版,从而选择他们需要的列进行显示
2、肯定是分页打印,每打印一页就从数据库中查一页,而不是把几十万条纪录都查出来然后在java环境里选择一页进行打印
所以sqlStr2变成
sqlStr3 = "select 用户需要的字段, rownum as rn from (" + sqlStr2 + ") where rn>=1 and rn<=30"
此时oracle报错:未明确定义列
这种情况在系统里用的很多,所以要做成通用化的处理过程,于是产生我的问题
Lastdrop 2003-10-17
  • 打赏
  • 举报
回复
如果你的外层select只是增加了rownum的话,可以放在内层,省去了外层SQL。
yangjuanli 2003-10-17
  • 打赏
  • 举报
回复
同意 tsj68(tsj) 的说法!
不过楼主这样做为什么实际的意义呢???
verybigmouthz 2003-10-17
  • 打赏
  • 举报
回复
同意tsj68(tsj) 的方法
直接, 如果有其他需要你也可以用
select f1, bh, '别名' f1, rownum as rn
from
( select fl, bh, fl '别名'
from dy_zd
where fl='R2'
) a
不过这样是不是有点多些一举呢
呵呵
tsj68 2003-10-16
  • 打赏
  • 举报
回复
在外层使用重复列,例如:
select f1,bh,f1,rownum as rn from ( select fl, bh from dy_zd where fl='R2')
yoken 2003-10-16
  • 打赏
  • 举报
回复
to : verybigmouthz(大嘴智)
我的情况还必须用数据库原字段名,不能用fl '别名'
verybigmouthz 2003-10-16
  • 打赏
  • 举报
回复
select a.*, rownum as rn
from
( select fl, bh, fl '别名'
from dy_zd
where fl='R2'
) a
就OK了
yoken 2003-10-16
  • 打赏
  • 举报
回复
to:bzszp(SongZip)
重复列可以使select语句简洁,如
"select to_char(a.tbrq, 'YYYY-MM-DD') as tbrq, to_char(a.jzrq, 'YYYY-MM-DD') as jzrq, " +
"a.*, b.bxgsmc, c.dwmc,a.bf1+a.bf2+a.bf3+a.bf4+a.bf5+a.bf6 as hj " +
"from rc_bxdmx a, rc_bxgs b, jc_dwml c " +
"where a.bxgsbh=b.bxgsbh and a.djh='" + djh + "' " +
"and substr(a.dwdm,1,length('" + dwdm + "'))='" + dwdm + "' " +
"and a.dwdm=c.dwdm"
为了转换tbrq和jzrq为char这样做可以省去写出rc_bxdmx表中30个字段名的繁琐,查询结果在java里访问时对同名列默认取第一列

to:beckhambobo(beckham)
从上面的select语句可以看出,无法采用你的变通方法
beckhambobo 2003-10-16
  • 打赏
  • 举报
回复
select 'R2', bh, 'R2',rownum rn from dy_zd where fl='R2'
bzszp 2003-10-16
  • 打赏
  • 举报
回复
重复列有什么意义吗?

17,377

社区成员

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

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