使用Union All 和Order By In View?
Posted
技术标签:
【中文标题】使用Union All 和Order By In View?【英文标题】:Use Union All & Order By In View? 【发布时间】:2015-03-14 14:52:48 【问题描述】:在我的视图中,我需要按两个表中包含的日期列进行排序。以下是我用于视图的语法,但如果我尝试在视图中使用 order by 语句,我会收到此错误:
消息 1033,级别 15,状态 1,TransFund_Lead_Upload_File 程序,第 63 行
ORDER BY 子句在视图、内联函数、派生表和子查询中无效,除非还指定了 TOP。
这是我的查询语法..需要更改什么以便我可以通过 [Follow Up] Desc 进行排序?
SELECT * FROM
(
Select
'abcd' As [P]
,ISNULL(Building_Name,'') As [Building_Name]
,ISNULL(ID,'') As [Record ID]
,ISNULL(city,'') + ', ' + ISNULL([state],'') As [Zone]
,ISNULL(CONVERT(VARCHAR(10), [Sale Date], 101),'') As [Actual Sale Date]
,'' As [Begin Effort]
,ISNULL(CAST(sold_items AS VARCHAR(500)),'') As [Items List]
,ISNULL(CAST(wascoreItemSold AS Varchar(500)),'') As [Info]
,ISNULL(CONVERT(VARCHAR(10), followupdate, 101),'') As [Follow Up]
FROM dbo.esrt b
UNION ALL
Select
'eeee' As [P]
,ISNULL(Building_Name,'') As [Building_Name]
,ISNULL(ID,'') As [Record ID]
,ISNULL(city,'') + ', ' + ISNULL([state],'') As [Zone]
,ISNULL(CONVERT(VARCHAR(10), Sale Date, 101),'') As [Actual Sale Date]
,'' As [Begin Effort]
,ISNULL(CAST(sold_items AS Varchar(500)),'') As [Items List]
,ISNULL(CAST(wascoreItemSold AS Varchar(500)),'') As [Info]
,ISNULL(CONVERT(VARCHAR(10), followupdate, 101),'') As [Follow Up]
FROM dbo.foxtrot a
) a
ORDER BY a.[Follow Up] DESC
【问题讨论】:
【参考方案1】:由于视图被视为子查询,因此排序会强制执行额外的工作。 SQL Server 将自动对表或视图中的数据进行排序,以优化查找结果,这就是结果可以以随机顺序返回的原因。使用视图对查询进行的任何过滤器和排序都会否定视图的排序子句。此外,根据您的视图正在做什么,SQL Server 可能会选择将视图的内容拉到主查询中,以便在单个查询计划中进一步优化。
请记住,SQL Server 本身并不关心它接收或传递结果的顺序。 TOP 语句告诉 SQL Server 有明确的理由需要对记录进行排序,因为这会影响返回的结果。
当您从查询中选择结果时,您必须进行排序。
SELECT *
FROM MyView
ORDER BY [Follow Up] DESC;
【讨论】:
以上是关于使用Union All 和Order By In View?的主要内容,如果未能解决你的问题,请参考以下文章
在 MySQL 中使用 Union All 和 Order By
如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序