Oracle,不使用子查询,SQL语句怎么写能返回按某个字段排序后的第一行?

ynduanlian 2010-12-21 11:22:05
比如表TableA有三个字段:C1 C2 C3

现在按C3排序查询:select * from TableA order by C3 desc
只取其中一条则:select * from (select * from TableA order by C3 desc) where rownum=1;
能返回按C3字段排序后的第一行。

但是如果不使用子查询的方式,是否可能实现同样的效果?
...全文
1082 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ynduanlian 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jsjzzh 的回复:]
大概思路。

使用RANK函数,应该可以不用子查询。


SQL code
SELECT C1, C2, C3 RANK() OVER(ORDER BY C3 DESC) FROM TABLEA
[/Quote]
哈哈,还没试,不过看来还是有高人有办法啊
jsjzzh 2010-12-21
  • 打赏
  • 举报
回复
大概思路。

使用RANK函数,应该可以不用子查询。

SELECT C1, C2, C3 RANK() OVER(ORDER BY C3 DESC) FROM TABLEA
WUNKANG 2010-12-21
  • 打赏
  • 举报
回复
应该要有两次SELECT才可以达到这个要求吧

[Quote=引用楼主 ynduanlian 的回复:]
比如表TableA有三个字段:C1 C2 C3

现在按C3排序查询:select * from TableA order by C3 desc
只取其中一条则:select * from (select * from TableA order by C3 desc) where rownum=1;
能返回按C3字段排序后的第一行。

但是如果不使用子查询的方式,是否可能实现同样的效果……
[/Quote]
Oraclefans_ 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gelyon 的回复:]

SQL code

select a.* from TableA a not exists (select 1 from TableA b where a.C3<b.C3)
[/Quote]
何谓子查询呢?
minitoy 2010-12-21
  • 打赏
  • 举报
回复
不用子查询无法实现.
Oraclefans_ 2010-12-21
  • 打赏
  • 举报
回复
排序是最后的操作了,你现在的需要的是排序后的第一条,似乎和你需要的实现有矛盾。
gelyon 2010-12-21
  • 打赏
  • 举报
回复
--试试:
select a.* from TableA a where not exists (select 1 from TableA b where a.C3<b.C3)
gelyon 2010-12-21
  • 打赏
  • 举报
回复

select a.* from TableA a not exists (select 1 from TableA b where a.C3<b.C3)
心中的彩虹 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 ynduanlian 的回复:]
比如表TableA有三个字段:C1 C2 C3

现在按C3排序查询:select * from TableA order by C3 desc
只取其中一条则:select * from (select * from TableA order by C3 desc) where rownum=1;
能返回按C3字段排序后的第一行。

但是如果不使用子查询的方式,是否可能实现同样的效果……
[/Quote]



--不用子查询 是不可能的

select * from TableA where c3=(select max(c3) from tablea)

--或者分析函数

湛卢VV 2010-12-21
  • 打赏
  • 举报
回复

select * from table where c3=MAX(C3)

coolkisses 2010-12-21
  • 打赏
  • 举报
回复
楼上,给的结果,不是楼主想要的吧
value_hzz 2010-12-21
  • 打赏
  • 举报
回复
补充说明,该办法只查出字段C3记录中最大的一条记录
比如 c1 c2 c3
1 3 1
3 4 2
则查询的结果是 3 4 2
value_hzz 2010-12-21
  • 打赏
  • 举报
回复
select
max(c1) keep(dense_rank last order by c3) as c1,
max(c2) keep(dense_rank last order by c3) as c2,
max(c3) keep(dense_rank last order by c3) as c3
from TABLEA
coolkisses 2010-12-21
  • 打赏
  • 举报
回复
楼主的语句,是嵌套吧,应该不是严格意义上的子查询吧
姑且把这种也算子查询,那么,楼主的意思是想一条语句搞定
非常遗憾的说一下,无法满足要求,因为使用rank函数,也需要外层过滤的

select * from
(
select c1,c2,c3
,row_number() over(order by QUERY_TAB_FIELD) rank_order
from TABLE_A t
)
where rank_order = 1
lxyzxq2008 2010-12-21
  • 打赏
  • 举报
回复

--估计不行
SELECT B.SID1,B.NAME,
ROW_NUMBER() OVER(ORDER BY B.SID1 desc)
FROM yyq B
WHERE rownum = 1

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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