创建了一个 视图 其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排序。

解决方案 »

  1.   

    view 在查看的时候再进行排序
    例如在你用这个视图的时候select * from yourviewname order by b
      

  2.   

    本帖最后由 josy 于 2012-01-18 00:29:02 编辑
      

  3.   


    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
      

  4.   

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

  5.   


    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)

    //////////
      

  6.   

    在union All 外面再加层 再排序就好了
      

  7.   

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

  8.   

    为什么 union all 之后顺序 会变化掉呢??
    大家帮看看。在线等。
      

  9.   

    这个问题让人费解
    估计是 union all 就乱了。。
    难道是先执行  union all 再 order by 
    无奈
      

  10.   

    创建视图的语句中不要有ORDER BY子句,在从视图获取数据的语句中再添加ORDER BY子句。
      

  11.   


    排序不了,case when px=1 then -b else b end ?是什么意思
      

  12.   

    http://zhidao.baidu.com/question/129433916.html视图是个查询结果集,是没有排序的,如果你使用了ORDER BY那么你必须于TOP关键字一起使用,这里ORDER BY 并不是对视图的结果进行排序,只是为了让TOP提取结果。
    当使用视图做查询,出来的结果想要排序,还得使用order by
      

  13.   

    理论上视图是不能排序的
    order by 后是一种游标了
    但是可以用top来转换所以你的top要足够大,嘿嘿