ms sql视图中 排序问题(order by )
[Quote=引用 5 楼 xiaolinyouni 的回复:]
SQL code
top 100 PERCENT...
加上这个有什么特殊的处理(好处)吗?
[/Quote]
学习了,还真不知道这种用法,
另外在中有一段话,谁帮我通俗的解释一下,没看懂..
/////////
一般情况下,在查询视图时您必须将视图作为其结果已被实例化查询中的虚拟表。在视图定义不包含 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)
//////////