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

本文探讨了在SQL Server中创建排序视图的常见误区,解释了为何视图不应包含ORDER BY子句,并通过具体示例说明了试图排序视图可能导致的问题。同时,文章引用了StackExchange上的案例,进一步阐述了视图排序的复杂性和潜在的混乱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

创建排序视图的企图本身就是错误的,因为视图表示一个表,而表是不会对行排序的。众所周知,在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
————————————————
版权声明:本文为CSDN博主「0XIX0」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ddzr972435946/article/details/102814602

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值