您好,欢迎来到[问答大全]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 问答大全 >> 电脑网络 >> sql 问题 求解锁 详情请看sql

sql 问题 求解锁 详情请看sql

来源:网络整理     时间:2016/3/20 20:15:39     关键词:

关于网友提出的“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:

sql 问题 求解锁  详情请看sqlsql 问题 求解锁  详情请看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

图:

sql 问题 求解锁  详情请看sqlsql 问题 求解锁  详情请看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

相关图片

相关文章