应该是很简单的事,关于SQL2005的视图浏览不排序问题

DelisPhi 2013-12-12 11:38:26
首先我用的sql2005的自带Management Studio。
我对一张含有商品名(iName)、价格(iPrice)、价格录入时间(iTime)的表(tPrice)做了一些筛选,建了一个视图(vPrice)。这个视图差不多就是
SELECT * FROM tPrice where iPrice>10000 order by iName,iPrice DESC
这样
但是我在管理器的视图上右键点打开视图的时候,排序是乱的,一定要在sql视图里的SELECT * FROM vPrice 后面手动加上 order by iNamemiPrice DESC 方才排好序。

这尼玛不科学啊~~~~~那我在建视图的时候加的order by给吃了么!!!
...全文
271 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-12-12
  • 打赏
  • 举报
回复
select top 100 percent * from tb order by xxxx 可行的
DelisPhi 2013-12-12
  • 打赏
  • 举报
回复
引用 6 楼 xxfvba 的回复:
如果是TOP 100 percent,order by不起作用;如果是top 100,order by 是起作用的吧
我一会试试
xxfvba 2013-12-12
  • 打赏
  • 举报
回复
如果是TOP 100 percent,order by不起作用;如果是top 100,order by 是起作用的吧
LongRui888 2013-12-12
  • 打赏
  • 举报
回复
引用 4 楼 DelisPhi 的回复:
引用 3 楼 yupeigu 的回复:
你看看你视图的定义里面,有加 order by吗,确认一下
虽然我现在上不去那个数据库,但就这一点我很肯定:肯定加了,我点开视图的设计界面能看到order by清清楚楚的在那里,TOP那个系统自动生成了。这个我之前就反复确认过的。不然也不会那么纠结了。
哦,那应该就是排序的了,你有数据不,贴个图出来,看看排序的效果
DelisPhi 2013-12-12
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
你看看你视图的定义里面,有加 order by吗,确认一下
虽然我现在上不去那个数据库,但就这一点我很肯定:肯定加了,我点开视图的设计界面能看到order by清清楚楚的在那里,TOP那个系统自动生成了。这个我之前就反复确认过的。不然也不会那么纠结了。
LongRui888 2013-12-12
  • 打赏
  • 举报
回复
你看看你视图的定义里面,有加 order by吗,确认一下
LongRui888 2013-12-12
  • 打赏
  • 举报
回复
在视图中是不允许有order by的,除非select 中有 top 才行,比如下面的就报错了:
create view dbo.v_wc
as

select *
from sys.objects
order by name desc
go
/*
消息 1033,级别 15,状态 1,过程 v_wc,第 9 行
除非另外还指定了 TOP 或 FOR XML,否则,
ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
*/
DelisPhi 2013-12-12
  • 打赏
  • 举报
回复
order by iNamemiPrice DESC笔误了改成order by iName,iPrice DESC
DelisPhi 2013-12-12
  • 打赏
  • 举报
回复
引用 14 楼 fcuandy 的回复:
[quote=引用 9 楼 DelisPhi 的回复:] 经过大家提醒,总结如下: 原来的select top (100) percent 是乱的; 改成select top 100 percent 也不行; 改成select top 100 可行; 最后的做法:select top 9999999999 可行。 就这样凑合用了还是怎么着?
你这些行或者不行的其实都是不行的。 你看似行的这些,可能由于sql在查询时底层的算法的输出刚好与排序项一致。 下次在别的场合又可能不对。 联机丛书已经很明确的说出了这一点: ORDER BY 子句仅用于确定视图定义中的 TOP 子句返回的行。ORDER BY 不保证在查询视图时得到有序结果,除非在查询本身中也指定了 ORDER BY。 我们从这句话,得到的结果只能是下面两点: 1, 视图创建语句里的order by 只是为了保证得到的记录按top 的输出,并不是为了排序。 2, 要得到正确的排序,需要在调用视图的查询语句里加order by. 说白了, 等同于以下 select * from (select top 100 * from ta order by id) 这句话的结果,可能是按id排序,也可能不是。 跟具实际的存储、底层的算法优化都有关系.[/quote]好吧,烧饼一样的SQL设计者们,你们赢了,准备结贴了
zbdzjx 2013-12-12
  • 打赏
  • 举报
回复
前两年也碰到这样的问题,“select top 100 percent……order by……”这样的语句之前在2000下经常使用,没什么问题。后来是用的2008 R2,结果就是不对。在网上搜了一下,说是从某个版本开始,将“select top 100 percent……order by……”这种语句中的“top 100 percent”给优化掉了,也就是不起效果了。只有改成“select top 10000000000”这样的语句了。
fcuandy 2013-12-12
  • 打赏
  • 举报
回复
引用 9 楼 DelisPhi 的回复:
经过大家提醒,总结如下: 原来的select top (100) percent 是乱的; 改成select top 100 percent 也不行; 改成select top 100 可行; 最后的做法:select top 9999999999 可行。 就这样凑合用了还是怎么着?
你这些行或者不行的其实都是不行的。 你看似行的这些,可能由于sql在查询时底层的算法的输出刚好与排序项一致。 下次在别的场合又可能不对。 联机丛书已经很明确的说出了这一点: ORDER BY 子句仅用于确定视图定义中的 TOP 子句返回的行。ORDER BY 不保证在查询视图时得到有序结果,除非在查询本身中也指定了 ORDER BY。 我们从这句话,得到的结果只能是下面两点: 1, 视图创建语句里的order by 只是为了保证得到的记录按top 的输出,并不是为了排序。 2, 要得到正确的排序,需要在调用视图的查询语句里加order by. 说白了, 等同于以下 select * from (select top 100 * from ta order by id) 这句话的结果,可能是按id排序,也可能不是。 跟具实际的存储、底层的算法优化都有关系.
koumingjie 2013-12-12
  • 打赏
  • 举报
回复
我记得2000 视图中排序是好使的,2005以后视图中的order by是不好用的,排序还是写在程序中吧
ldzyxb 2013-12-12
  • 打赏
  • 举报
回复
边学边混分,HAPPY!! 新人才200分,不够发帖几次哪,看到一周回复10次就可以送30分,我就靠这个涨分了,亲,别删我,无视我就好了,混分+学习。
LongRui888 2013-12-12
  • 打赏
  • 举报
回复
引用 9 楼 DelisPhi 的回复:
经过大家提醒,总结如下: 原来的select top (100) percent 是乱的; 改成select top 100 percent 也不行; 改成select top 100 可行; 最后的做法:select top 9999999999 可行。 就这样凑合用了还是怎么着?
呵呵,这个是好办法select top 9999999999 可行
DelisPhi 2013-12-12
  • 打赏
  • 举报
回复
哦对了补一句select top 99.9 percent也能排好序。。。我擦咧,不让把所有行列出来的节奏么。。
DelisPhi 2013-12-12
  • 打赏
  • 举报
回复
经过大家提醒,总结如下: 原来的select top (100) percent 是乱的; 改成select top 100 percent 也不行; 改成select top 100 可行; 最后的做法:select top 9999999999 可行。 就这样凑合用了还是怎么着?

34,589

社区成员

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

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