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字段排序后的第一行。

但是如果不使用子查询的方式,是否可能实现同样的效果?
...全文
917 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
  • 打赏
  • 举报
回复
相关推荐
发帖
Oracle
加入

1.6w+

社区成员

Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
申请成为版主
帖子事件
创建了帖子
2010-12-21 11:22
社区公告
暂无公告