创建了一个 视图 其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排序。
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排序。
例如在你用这个视图的时候select * from yourviewname order by b
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
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)
|--Book Lookup(BOOKMARK:([Bmk1000]), OBJECT:([Northwind].[dbo].[Orders]))
|--Index Scan(OBJECT:([Northwind].[dbo].[Orders].[OrderDate]), ORDERED)
//////////
大家帮看看。在线等。
估计是 union all 就乱了。。
难道是先执行 union all 再 order by
无奈
排序不了,case when px=1 then -b else b end ?是什么意思
当使用视图做查询,出来的结果想要排序,还得使用order by
order by 后是一种游标了
但是可以用top来转换所以你的top要足够大,嘿嘿