ms sql视图中 排序问题(order by )

NetLve 2012-01-18 12:13:09
创建了一个 视图 其sql 如下:
select * From (
SELECT top 100 PERCENT a,b,c
FROM tb
WHERE DATEDIFF(day, b ,getdate())>=3
order by b desc) asd
union all
select * From (
SELECT top 100 PERCENT a,b,c
FROM tb
WHERE DATEDIFF(day, b ,getdate())<3
order by b asc) def

但是结果并没有按照 b 排序

union all 前后两个 sql 单独查询却是排序的结果,但是放在一个 view里面,其结果并不是按b排序。
...全文
1013 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
NetLve 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 whb147 的回复:]

理论上视图是不能排序的
order by 后是一种游标了
但是可以用top来转换

所以你的top要足够大,嘿嘿
[/Quote]
是的,但是不科学。
NetLve 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 whb147 的回复:]

理论上视图是不能排序的
order by 后是一种游标了
但是可以用top来转换

所以你的top要足够大,嘿嘿
[/Quote]
是的,但是不科学。
whb147 2012-01-19
  • 打赏
  • 举报
回复
理论上视图是不能排序的
order by 后是一种游标了
但是可以用top来转换

所以你的top要足够大,嘿嘿
Neetgo 2012-01-19
  • 打赏
  • 举报
回复
http://zhidao.baidu.com/question/129433916.html

视图是个查询结果集,是没有排序的,如果你使用了ORDER BY那么你必须于TOP关键字一起使用,这里ORDER BY 并不是对视图的结果进行排序,只是为了让TOP提取结果。
当使用视图做查询,出来的结果想要排序,还得使用order by
叶子 2012-01-18
  • 打赏
  • 举报
回复

create table hhh1(id int,col varchar(20))

--这样创建视图无效
create view hhh1view
as
select * from hhh1 order by col

/*
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
*/

--这种创建就可以了
create view hhh1view
as
select * from hhh1

select * from hhh1view order by col
百年树人 2012-01-18
  • 打赏
  • 举报
回复
select a,b,c From (
SELECT 1 as px,a,b,c
FROM tb
WHERE DATEDIFF(day, b ,getdate())>=3
union all
SELECT 2 as px,a,b,c
FROM tb
WHERE DATEDIFF(day, b ,getdate())<3
) t
order by
px,
case when px=1 then -b else b end
叶子 2012-01-18
  • 打赏
  • 举报
回复
view 在查看的时候再进行排序
例如在你用这个视图的时候

select * from yourviewname order by b
NetLve 2012-01-18
  • 打赏
  • 举报
回复
感谢大家。
NetLve 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 josy 的回复:]

SQL code
select a,b,c From (
SELECT 1 as px,a,b,c
FROM tb
WHERE DATEDIFF(day, b ,getdate())>=3
union all
SELECT 2 as px,a,b,c
FROM tb
WHERE DATEDIFF(day, b ,getdate())<3
) t
……
[/Quote]

排序不了,case when px=1 then -b else b end ?是什么意思
gogodiy 2012-01-18
  • 打赏
  • 举报
回复
创建视图的语句中不要有ORDER BY子句,在从视图获取数据的语句中再添加ORDER BY子句。
NetLve 2012-01-18
  • 打赏
  • 举报
回复
这个问题让人费解
估计是 union all 就乱了。。
难道是先执行 union all 再 order by
无奈
NetLve 2012-01-18
  • 打赏
  • 举报
回复
为什么 union all 之后顺序 会变化掉呢??
大家帮看看。在线等。
NetLve 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 maco_wang 的回复:]

view 在查看的时候再进行排序
例如在你用这个视图的时候

SQL code
select * from yourviewname order by b
[/Quote]
叶子这样试验过。数据还是没安预期的排序。。
百年树人 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 netlve 的回复:]
引用 8 楼 jtsky001 的回复:

最外面一层加一个order by 试试呢?

不行的。
[/Quote]

查询视图的时候用3楼试试
NetLve 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jtsky001 的回复:]

最外面一层加一个order by 试试呢?
[/Quote]
不行的。
惊虹天健 2012-01-18
  • 打赏
  • 举报
回复
最外面一层加一个order by 试试呢?
tony312ws 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 josy 的回复:]
SQL code
select a,b,c From (
SELECT 1 as px,a,b,c
FROM tb
WHERE DATEDIFF(day, b ,getdate())>=3
union all
SELECT 2 as px,a,b,c
FROM tb
WHERE DATEDIFF(day, b ,getdate())<3 ……
[/Quote]
在union All 外面再加层 再排序就好了
苦苦的潜行者 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiaolinyouni 的回复:]

SQL code
top 100 PERCENT...


加上这个有什么特殊的处理(好处)吗?
[/Quote]

http://hi.baidu.com/dreamontheway/blog/item/482187efb315bf252df534e9.html
http://support.microsoft.com/kb/297469
学习了,还真不知道这种用法,

另外在http://support.microsoft.com/kb/297469中有一段话,谁帮我通俗的解释一下,没看懂..
/////////
一般情况下,在查询视图时您必须将视图作为其结果已被实例化查询中的虚拟表。在视图定义不包含 TOP 子句的情况下,限制在视图中对查询中使用的一些可以被"推送"向下到视图计算其自身,以便更少的行都需要进行实例化。但是,如果视图中包含 TOP 子句此优化可能会导致不正确的结果。在此优化将是有效的唯一情况是 TOP 100 PERCENT 的情况下您将在何处获得相同的结果,不管筛选是在视图具体化过程中或之后。

SQL Server 不允许您使用 ORDER BY 子句创建一个视图,除非还没有在视图中的 TOP 操作。一些客户试图创建一个视图,仅选择前的 100%,根据一些条件排序的行,希望从视图的选择将总是返回结果的排序方式指示在视图中。

与任何其他表中的 SELECT 结果返回给客户端的顺序是未定义,除非查询指定 ORDER BY 子句为查询的一部分。在其定义包括 TOP 或 ORDER BY 子句的视图的情况下 ORDER BY 子句在视图中被允许仅为定义之前为正在执行的 TOP 操作行的排序。例如对于如果要创建来自订单表选择 10 个最最近已订购的物料的视图,视图表示为:
USE northwind
GO
CREATE VIEW dbo.vwLastTenOrders AS SELECT TOP 10 * FROM Orders ORDER BY OrderDate DESC

SQL Server 不能保证您从一个视图包含 TOP 或 ORDER BY 子句,查询将返回已在视图中的请求以相同的方式排序的结果。对视图进行简单查询的结果可能会将已订购,但它们不能保证进行排序。在某些情况下 SELECT 执行联接或在视图与其他关系操作,您可能会发现不始终排序结果。如果应用程序需要排序的结果,查询视图时,您必须在该查询中包括 ORDER BY 子句。例如:
SELECT * FROM northwind.dbo.vwLastTenOrders WHERE ShippedDate IS NOT NULL ORDER BY OrderDate

对于前面的示例查询计划是类似于以下内容。

注: 为了确保该查询返回正确的结果,该视图已具体化之后,必须执行 IS NOT NULL 子句筛选器。

|--Sort(ORDER BY:([Orders].[OrderDate] ASC))
|--Filter(WHERE:([Orders].[ShippedDate]<>NULL))
|--Top(10)
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([Northwind].[dbo].[Orders]))
|--Index Scan(OBJECT:([Northwind].[dbo].[Orders].[OrderDate]), ORDERED)

//////////
苦苦的潜行者 2012-01-18
  • 打赏
  • 举报
回复
top 100 PERCENT...


加上这个有什么特殊的处理(好处)吗?

34,571

社区成员

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

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