关于网友提出的“sql 问题 求解锁 详情请看sql”问题疑问,本网通过在网上对“sql 问题 求解锁 详情请看sql”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:sql 问题 求解锁 详情请看sql
描述: Info表中有五条记录(下图),请看sql:
select*from[Info]where[Id]>3orderby[SubTime]ascselecttop1*from[Info]where[Id]>3orderby[SubTime]asc
为什么 Top 1的结果不是Id为4的而是Id为5的?求知道的园友解释一下,在线等!!!
附上建表和数据的sql:


USE[xiaocainiao]GO/****** Object: Table [dbo].[Info] Script Date: 2015/1/30 16:41:25 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATETABLE[dbo].[Info](
[Id][int]IDENTITY(1,1) NOTNULL,
[Name][nvarchar](50) NOTNULL,
[SubTime][datetime]NOTNULL,
CONSTRAINT[PK_Info]PRIMARYKEYCLUSTERED(
[Id]ASC
)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON[PRIMARY]
) ON[PRIMARY]GOALTERTABLE[dbo].[Info]ADDCONSTRAINT[DF_Info_SubTime]DEFAULT (getdate()) FOR[SubTime]GO
建表sql图:


解决方案1:此问题没什么纠结的,很正常的,其实结果的不正常的原因在于使用不当,本身TOP的使用时配合order by配合使用的,并且保证在order by有效的情况下才能正常的TOP N列。
而楼主的时间列都一样,所以这里的TOP N理论应为随机值,但是再深入一点你会发现这块数据并非随机,底层是根据数据页中的数据排序进行倒序输出的,这一点目的我感觉就是为了保证性能,因为表中存在聚集索引,所以底层数据为为了保证排序有TOP N是从获取完数据后倒序输出的。
顺便说一下:菠萝兄提到的此查询并非index scan...而是index seek....
解决方案2:1、你的subtime上没有索引,即便order by,也是做cluster index scan,这并不一定保证你的顺序和聚集索引顺序一样
2、如果你在subtime上加了索引,由于非聚集索引的叶子节点为聚集键的value,所以查询出来就是4
解决方案3:时间都一样,这order by有意义?
解决方案4:感觉4看起来比较优雅? 还是你的幸运数字是4?
解决方案5:告诉我为什么结果应该是 4 ,而不是 5 呢?
以上介绍了“sql 问题 求解锁 详情请看sql”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/wd/482679.html