加top和不加top结果的顺序为什么不一致

特别 2018-10-24 05:06:47
创建表变量

declare @t as Table
(
ITEM_CODE nvarchar(200),
ITEM_NAME nvarchar(200)
)


添加测试数据

insert into @t
select '20181024001','压条'
union all select '20181024002','压条'
union all select '20181024003','压条'
union all select '20181024004','压条'
union all select '20181024005','压条'
union all select '20181024008','压条'
union all select '20181024009','压条'
union all select '20181024006','压条'
union all select '20181024007','压条'
union all select '20181024010','压条'
union all select '20181024011','压条'


查询1,加top

SELECT top 20 ITEM_CODE,ITEM_NAME
FROM @t
--WHERE [ITEM_NAME] LIKE N'%压条%'
ORDER BY [ITEM_NAME] ASC


查询1的结果,看上去好象是和insert相反的顺序
20181024011 压条
20181024010 压条
20181024007 压条
20181024006 压条
20181024009 压条
20181024008 压条
20181024005 压条
20181024004 压条
20181024003 压条
20181024002 压条
20181024001 压条

查询2,不加top

SELECT ITEM_CODE,ITEM_NAME
FROM @t
--WHERE [ITEM_NAME] LIKE N'%压条%'
ORDER BY [ITEM_NAME] ASC


查询2的结果,
ITEM_CODE ITEM_NAME
20181024001 压条
20181024002 压条
20181024003 压条
20181024004 压条
20181024005 压条
20181024008 压条
20181024009 压条
20181024006 压条
20181024007 压条
20181024010 压条
20181024011 压条

================
本例的结果好象是:
如果order by 的字段值相同
不加top 按照相邻字段升序
加top 按照insert 反序

--------------------------------------
求教大神,为什么会出现这样的情况
...全文
285 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2018-10-25
  • 打赏
  • 举报
回复
引用 4 楼 sdfkfkd 的回复:
结贴。 谢谢各位的回答。 找到一些其他答案 SQL Server 2012 使用OFFSET分页遇到的问题 SQL Server中TOP子句导致的问题以及解决 Ordering guarantees in SQL Server… 感觉在分页的时候,如果排序列不能唯一地确定一行,尽量不要使用top进行分页。特殊是每页不超过100笔的情况下。
不这是样。 分页时, 排序列就应该唯一确定一行。要不翻页时次序不确定就失去意义了。 数据库是动态的, 时刻都有可能有数据 insert, update, delete , 这些都可能打乱你原来“不确定”的次序。 如果有较多雷同的值, 排序可以用上主键作为复合排序, 比如: order by name, id
特别 2018-10-25
  • 打赏
  • 举报
回复
结贴。 谢谢各位的回答。 找到一些其他答案 SQL Server 2012 使用OFFSET分页遇到的问题 SQL Server中TOP子句导致的问题以及解决 Ordering guarantees in SQL Server… 感觉在分页的时候,如果排序列不能唯一地确定一行,尽量不要使用top进行分页。特殊是每页不超过100笔的情况下。
吉普赛的歌 版主 2018-10-24
  • 打赏
  • 举报
回复
引用 2 楼 sdfkfkd 的回复:
[quote=引用 1 楼 yenange 的回复:] 比方说, 你们班有40个同学, 每个人的名字都跟你一样, 叫“特别”, 然后老师说按名字的拼音的顺序来排队, 你觉得每个同学的顺序是可以确定的吗?
谢谢。 我的疑惑是:同一条查询,多次执行结果是一样的, 为什么加了top就会导致结果的顺序不一致。 而且本例中的top 20实际上包括了所有数据[/quote] 首先, 你自身的语句的顺序本身不能保证一致。 SQL Server 会自己根据消耗最小的方式给出一个结果。 这个没什么很大意义, 不必深究了
特别 2018-10-24
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
比方说, 你们班有40个同学, 每个人的名字都跟你一样, 叫“特别”, 然后老师说按名字的拼音的顺序来排队, 你觉得每个同学的顺序是可以确定的吗?
谢谢。 我的疑惑是:同一条查询,多次执行结果是一样的, 为什么加了top就会导致结果的顺序不一致。 而且本例中的top 20实际上包括了所有数据
吉普赛的歌 版主 2018-10-24
  • 打赏
  • 举报
回复
比方说, 你们班有40个同学, 每个人的名字都跟你一样, 叫“特别”, 然后老师说按名字的拼音的顺序来排队, 你觉得每个同学的顺序是可以确定的吗?

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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