SQL语句创建视图为什么不能用order by

很多地方都没解释清楚这个问题,有代表性的就是这个 博客 。

论坛 上有人解释了,但是年代久远,我这里把它捞出来。答主是 这位 。内容如下:

创建排序视图的企图本身就是错误的,因为视图表示一个表,而表是不会对行排序的。众所周知,在SQL Server 2000中追求排序视图的开发人员会利用貌似系统漏洞的一个技巧。

利用这个漏洞可以创建一个非常可笑的视图,在该视图中,指定TOP 100 PERCENT以及一个ORDER BY子句,就像这样:

ALTER VIEW dbo.VcustsWithOrders

AS

SELECT TOP (100) PERCENT

Country, CustomerID, CompanyName, ContactName, ContactTitle,

Address, City, Region, PostalCode, Phone, Fax

FROM Customers AS C

WHERE EXISTS

(SELECT * FROM dbo.Orders AS O

   WHERE O.CustomerID = C.CustomerID)

ORDER BY Country;

GO

这些语句最终的执行结果有两列 country ,怎么排序呢?会引起混乱。视图不允许排序的根源就是在后续处理中会引起混乱,不能用 distinct 应该也一样。总之,把视图当成基本表来约束就很安全。

还有一个例子是从 StackExchange (链接)来的:

If a view was allowed to be sorted then what should be the order of the result here?

CREATE VIEW dbo.V1
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number ASC

GO

CREATE VIEW dbo.V2
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number DESC

GO

SELECT *
FROM   dbo.V1
       JOIN dbo.V2
         ON V1.number = V2.number 

你可能感兴趣的:(数据库)