Oracle 简单语句

程序小海 2012-05-11 10:56:17

select (case when a.TOTALNETUNIT is not null then
( select c.TOTALNETUNIT from FND_DERNAV c where c.SECUCODE=a.secucode and rownum=1 order by c.enddate desc )
else a.totalnetunit
end) as MyColumn
from FND_DERNAV a inner join FND_DAILYQUOTE b on a.SECUCODE=b.secucode and b.TRADINGDAY=a.ENDDATE


"报ORA-00907 缺失右括号“

求解 我这条sql为什么会出错呢?
...全文
143 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

不说语法问题,单看你这个SQL code
and rownum=1 order by c.enddate desc
的用法就有问题,rownum是个伪列,是先于order by子句执行的,所以你加个按结束日期排序毫无意义,不信你把desc改成asc看看,结果是一样的。

select* from FND_DERNAV where rownum=1 o……
[/Quote]

是没报错 但是取的数据不是你想要的 相当于select* from FND_DERNAV where rownum=1 也就是排序完全没起到作用

如果要取排序后的 要先排序再取

select * from
(select *
from FND_DERNAV
order by enddate desc)
where rownum=1
程序小海 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

不说语法问题,单看你这个SQL code
and rownum=1 order by c.enddate desc
的用法就有问题,rownum是个伪列,是先于order by子句执行的,所以你加个按结束日期排序毫无意义,不信你把desc改成asc看看,结果是一样的。
[/Quote]
select* from FND_DERNAV where rownum=1 order by enddate desc

这条sql 我执行下来 没报什么问题啊?
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

不说语法问题,单看你这个SQL code
and rownum=1 order by c.enddate desc
的用法就有问题,rownum是个伪列,是先于order by子句执行的,所以你加个按结束日期排序毫无意义,不信你把desc改成asc看看,结果是一样的。
[/Quote]

还真没注意 order by 和rownum合用...

如果要排序取一行只有嵌套或者over函数了
没_没_没超疯 2012-05-11
  • 打赏
  • 举报
回复
不说语法问题,单看你这个
 and rownum=1 order by c.enddate desc
的用法就有问题,rownum是个伪列,是先于order by子句执行的,所以你加个按结束日期排序毫无意义,不信你把desc改成asc看看,结果是一样的。
  • 打赏
  • 举报
回复
仿写了简单的sql 没问题

select (case when 'a'='a' then
(select 'a' a from dual)
else 'b'
end) c
from dual



是不是括号不是英文格式?
  • 打赏
  • 举报
回复
初步看来 语法应该没问题
suntaix 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 6 楼 的回复:

引用 5 楼 的回复:

引用 3 楼 的回复:

不说语法问题,单看你这个SQL code
and rownum=1 order by c.enddate desc
的用法就有问题,rownum是个伪列,是先于order by子句执行的,所以你加个按结束日期排序毫无意义,不信你把desc改成asc看看,结果是一样的。

select* from FN……
[/Quote]
可能是少括号了
程序小海 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

select (case
when a.TOTALNETUNIT is not null then
(select c.TOTALNETUNIT
from FND_DERNAV c
where c.SECUCODE = a.secucode and rownum = 1
……
[/Quote]

姑娘 你的想法是不对的哦~
程序小海 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

引用 3 楼 的回复:

不说语法问题,单看你这个SQL code
and rownum=1 order by c.enddate desc
的用法就有问题,rownum是个伪列,是先于order by子句执行的,所以你加个按结束日期排序毫无意义,不信你把desc改成asc看看,结果是一样的。

select* from FND_DERNAV wh……
[/Quote]


select a.secucode, (case when a.TOTALNETUNIT is not null then
(select TOTALNETUNIT from ( select c.TOTALNETUNIT from FND_DERNAV c where c.SECUCODE=a.secucode order by c.enddate desc) where rownum=1)
else a.totalnetunit
end) as MyColumn
from FND_DERNAV a inner join FND_DAILYQUOTE b on a.SECUCODE=b.secucode and b.TRADINGDAY=a.ENDDATE


红色的部分 就不能识别了~ 我想到一种方法 但是速度实在不行

槑党--一缕风 2012-05-11
  • 打赏
  • 举报
回复
select (case
when a.TOTALNETUNIT is not null then
(select c.TOTALNETUNIT
from FND_DERNAV c
where c.SECUCODE = a.secucode and rownum = 1
order by c.enddate desc)
else
a.totalnetunit
end) as MyColumn
from FND_DERNAV a
inner join FND_DAILYQUOTE b
on a.SECUCODE = b.secucode
and b.TRADINGDAY = a.ENDDATE

应该是我标红的地方出错,你可以用在这个地方设置一个常量试试。
Oracle 好像只能套一个括号,套多了就失效了~~

不知道我的想法是不是对的

17,377

社区成员

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

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