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 
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值