很坑爹的sql 排序问题

justbit 2012-03-27 09:50:12
原始代码 排序没问题
select b.Knowledge,c.LectureTitle,a.StudyNum
,(select COUNT(*) from studyDBNew.dbo.tblUserStudyRecord as r
where r.UserId = 'test' and r.LectureGuid = c.LectureGuid) as userNum
,(select LoreTitle+' ' from studyDBNew.dbo.tblLectureLore as i
left join studyDBNew.dbo.tblCourseLore as ii on i.LoreId = ii.CourseLoreId
where c.LectureGuid = i.LectureGuid for XML path('') ) as lore
,c.LectureContent,c.LectureId,a.aid,c.ToUrl2
from studyDBNew.dbo.tblCourseWare as a
left join studyDBNew.dbo.tblKnowledge as b on a.CourseWareGuid = b.CourseWareGuid
left join studyDBNew.dbo.tblLectures as c on b.KnowledgeGuid = c.KnowledgeGuid
where a.CourseWareId =628 and isnull(LectureId,'')<>'' order by b.Sort,c.Sort


ROW_NUMBER() 后排序完全变了
SELECT * FROM 
(SELECT
TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY b.Sort,c.sort) Row,
b.Knowledge,c.LectureTitle,a.StudyNum
,(select COUNT(*) from studyDBNew.dbo.tblUserStudyRecord as r
where r.UserId = 'test' and r.LectureGuid = c.LectureGuid) as userNum
,(select LoreTitle+' ' from studyDBNew.dbo.tblLectureLore as i
left join studyDBNew.dbo.tblCourseLore as ii on i.LoreId = ii.CourseLoreId
where c.LectureGuid = i.LectureGuid for XML path('') ) as lore
,c.LectureContent,c.LectureId,a.aid,c.Sort
from studyDBNew.dbo.tblCourseWare as a
left join studyDBNew.dbo.tblKnowledge as b on a.CourseWareGuid = b.CourseWareGuid
left join studyDBNew.dbo.tblLectures as c on b.KnowledgeGuid = c.KnowledgeGuid
where a.CourseWareId =628 and isnull(LectureId,'')<>'' )
TMP
WHERE Row>0 AND Row<=10


经过查找后发现 把 r.UserId = 'test' 去掉后 就正常了
SELECT * FROM 
(SELECT
TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY b.Sort,c.sort) Row,
b.Knowledge,c.LectureTitle,a.StudyNum
,(select COUNT(*) from studyDBNew.dbo.tblUserStudyRecord as r
where
-- r.UserId = 'test' and
r.LectureGuid = c.LectureGuid) as userNum
,(select LoreTitle+' ' from studyDBNew.dbo.tblLectureLore as i
left join studyDBNew.dbo.tblCourseLore as ii on i.LoreId = ii.CourseLoreId
where c.LectureGuid = i.LectureGuid for XML path('') ) as lore
,c.LectureContent,c.LectureId,a.aid,c.Sort
from studyDBNew.dbo.tblCourseWare as a
left join studyDBNew.dbo.tblKnowledge as b on a.CourseWareGuid = b.CourseWareGuid
left join studyDBNew.dbo.tblLectures as c on b.KnowledgeGuid = c.KnowledgeGuid
where a.CourseWareId =628 and isnull(LectureId,'')<>'' )
TMP
WHERE Row>0 AND Row<=10


请各位大神帮帮小弟解解惑啊!!!
...全文
73 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
justbit 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 beirut 的回复:]

引用 8 楼 itlizhi 的回复:

老大解决了,加了个索引

加个索引也不一定就确定了你语句的顺序,
如果你希望排序就要加上 order by
否则 得到的结果是不能保证有序的。
加了索引,查询走索引路线,你得到的结果会按照索引的顺序返回
但是你无法保证你的语句一定都走索引路线,还有就是一个表索引多了,等等。。
[/Quote]
其实我是 order by 了的啊 PERCENT ROW_NUMBER() OVER (ORDER BY b.Sort,c.sort)
他没走 这个排序嘛 我也很无语啊,以前都走得啊
黄_瓜 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 itlizhi 的回复:]

老大解决了,加了个索引
[/Quote]
加个索引也不一定就确定了你语句的顺序,
如果你希望排序就要加上 order by
否则 得到的结果是不能保证有序的。
加了索引,查询走索引路线,你得到的结果会按照索引的顺序返回
但是你无法保证你的语句一定都走索引路线,还有就是一个表索引多了,等等。。
SQL777 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 itlizhi 的回复:]
老大解决了,加了个索引
[/Quote]
如果不指定排序。排序是不确定的。(非聚集表)
justbit 2012-03-27
  • 打赏
  • 举报
回复
老大解决了,加了个索引
justbit 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sql777 的回复:]

引用 4 楼 itlizhi 的回复:
引用 2 楼 sql777 的回复:

引用 1 楼 itlizhi 的回复:
没人吗?自己先顶下!!!

给个结果瞧瞧

----正常的
row b.sort c.srot
1 导学 500 6 NULL 17775 NULL 0 601
2 课程引入 500 12 NULL 16675 NULL 1 101
3 问题一 500 ……
[/Quote]

我 知道啊 但是这个是为什么呢? 而且那个分页的是个公用方法 也不好改!!!
SQL777 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 itlizhi 的回复:]
引用 2 楼 sql777 的回复:

引用 1 楼 itlizhi 的回复:
没人吗?自己先顶下!!!

给个结果瞧瞧

----正常的
row b.sort c.srot
1 导学 500 6 NULL 17775 NULL 0 601
2 课程引入 500 12 NULL 16675 NULL 1 101
3 问题一 500 10 NULL 16674 NULL 1 1……
[/Quote]
你再指定ORDER BY ROW不就OK了
justbit 2012-03-27
  • 打赏
  • 举报
回复
后面 2个字段 是 排序字段 b.sort c.srot
justbit 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sql777 的回复:]

引用 1 楼 itlizhi 的回复:
没人吗?自己先顶下!!!

给个结果瞧瞧
[/Quote]
----正常的
row b.sort c.srot
1 导学 500 6 NULL 17775 NULL 0 601
2 课程引入 500 12 NULL 16675 NULL 1 101
3 问题一 500 10 NULL 16674 NULL 1 102
4 问题二 500 6 NULL 16673 NULL 1 103
5 问题三 500 2 NULL 16672 NULL 1 104
6 问题四 500 2 NULL 17869 NULL 1 105
7 问题五 500 4 NULL 16671 NULL 1 106
8 问题六 500 2 NULL 16670 NULL 1 107
9 课程引入 500 6 NULL 16681 NULL 2 201
10 问题一 500 4 NULL 16680 NULL 2 202
--加r.UserId = 'test' 条件后
row b.sort c.srot
5 问题三 500 2 NULL 16672 NULL 1 104
8 问题六 500 2 NULL 16670 NULL 1 107
2 课程引入 500 2 NULL 16675 NULL 1 101
4 问题二 500 2 NULL 16673 NULL 1 103
1 导学 500 6 NULL 17775 NULL 0 601
6 问题四 500 2 NULL 17869 NULL 1 105
3 问题一 500 2 NULL 16674 NULL 1 102
10 问题一 500 2 NULL 16680 NULL 2 202
7 问题五 500 4 NULL 16671 NULL 1 106
9 课程引入 500 2 NULL 16681 NULL 2 201
Vidor 2012-03-27
  • 打赏
  • 举报
回复
没有order by的行集是无序的,最后order by。
SQL777 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 itlizhi 的回复:]
没人吗?自己先顶下!!!
[/Quote]
给个结果瞧瞧
justbit 2012-03-27
  • 打赏
  • 举报
回复
没人吗?自己先顶下!!!

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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