SQL取出某列最大值的所有记录(行),有点疑问请教

daishaodong 2010-02-26 06:30:15
表tb

A B C
------------
1 2 2
1 2 3
1 2 4
2 2 4
3 2 4

c列为最大时的结果集:
1 2 4
2 2 4
3 2 4

有多种方法,其中有:
select a.* from tb a where 1 > (select count(*) from tb where c > a.c )

可以实现,但这个语句的原理还有点模糊,谁能详细解释下。。

该语句中(select count(*) from tb where c > a.c )的结果应该是4,

该语句有点类似exit的原理,但又不全是,语句中的 1> 的意思有点像求反的意思,如果改成 4>,则结果集就多了一行

测试代码如下:

if object_id('tb') IS NOT NULL DROP TABLE tb

CREATE TABLE tb(a VARCHAR,b VARCHAR,c VARCHAR)
GO
INSERT INTO tb SELECT '1',2,'2'
UNION ALL SELECT '1','2','3'
UNION ALL SELECT '1','2','4'
UNION ALL SELECT '2','2','4'
UNION ALL SELECT '3','2','4'

select a.* from tb a where 1 > (select count(*) from tb where c > a.c )
--找出c为最大的所有行
...全文
1652 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
daishaodong 2010-02-26
  • 打赏
  • 举报
回复
原来(select count(*) from tb where c > a.c )
会产生多组结果,会把每行的比较结果统计出来。。
谢谢各位。。
东那个升 2010-02-26
  • 打赏
  • 举报
回复
select a.* from tb a where 1 > (select count(*) from tb where c > a.c )


可以看成从a表依次取出一行数据,然后再查询整个a表看看比该行数据中的C值大的有多少行,如果不存在即<1时就显示该行,否则舍弃。
SQL77 2010-02-26
  • 打赏
  • 举报
回复
if object_id('tb') IS NOT NULL DROP TABLE tb 

CREATE TABLE tb(a VARCHAR,b VARCHAR,c VARCHAR)
GO
INSERT INTO tb SELECT '1',2,'2'
UNION ALL SELECT '1','2','3'
UNION ALL SELECT '1','2','4'
UNION ALL SELECT '2','2','4'
UNION ALL SELECT '3','2','4'

select a.* ,(select count(*) from tb where c > a.c ) from tb a


(所影响的行数为 5 行)

a b c
---- ---- ---- -----------
1 2 2 4
1 2 3 3
1 2 4 0
2 2 4 0
3 2 4 0

(所影响的行数为 5 行)


看一下就清楚了
daishaodong 2010-02-26
  • 打赏
  • 举报
回复
顶下,让大家来看看。。。。。。。。。

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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