【问题标题】:The ORDER BY clause is invalid in viewsORDER BY 子句在视图中无效
【发布时间】:2014-01-12 05:02:54
【问题描述】:

我收到此错误:
ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP 或 FOR XML。 在下面的代码中,尝试从视图中订购时。我该如何解决这个问题?

USE [MYDB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER VIEW [dbo].[vw_FCoord]
AS
SELECT     FeatId, ISNULL(MLNumber, '') AS MLNumber,
                          (SELECT     Text
                            FROM          dbo.tblFType AS ft
                            WHERE      (FTypeId = dbo.tblFeat.FTypeId)) AS FType, Height, Width, Depth, ISNULL(Description, '') AS Description, 
                                 Latitude, Longitude * - 1 AS Longitude, IsSubsidence, ISNULL(ProjectName, '') 
                      AS ProjectName, ISNULL
                          ((SELECT     Text
                              FROM         dbo.tblFStatusType AS fst
                              WHERE     (FStatusTypeId = dbo.tblFeat.FStatusTypeId)), 'Not Set') AS FStatus, ISNULL
                          ((SELECT     Text
                              FROM         dbo.tblSGType AS st
                              WHERE     (SGTypeId = dbo.tblFeat.SGTypeId)), 'Not Set') AS SGType, SGIsBackfillMaterial, SGDate, 
                      ISNULL(SGDetails, '') AS SGDetails, SGCost, SGIsBatCompatible,
                      (Select COUNT(*) from tblProjectFeat pf where pf.FeatId=dbo.tblFeat.FeatId) NumProjects 
FROM         dbo.tblFeat
WHERE     (Latitude > 0) AND (Longitude > 0)
order by NumProjects asc
GO

【问题讨论】:

  • 您无法对数据进行有序视图,您能做的最好的事情就是从您的视图中选择,然后对数据进行排序。

标签: sql tsql


【解决方案1】:

您不能在视图中指定ORDER BY 子句。创建不带ORDER BY 的视图,并在从视图中选择时指定ORDER BY 子句:

ALTER VIEW [dbo].[vw_FCoord]
...
GO


SELECT
    *
FROM vw_FCoord
ORDER BY NumProjects ASC

【讨论】:

  • 这样做的原因通常是务实的 - 视图更多是为了获得某种收集的实体,但它必须如何排序取决于谁在问。由于每当调用视图时都可能添加ORDER BY,并使用一组不同 列,它会要求优化器执行不必要的工作(简单地丢弃)。所以,防止开发人员让数据库做它不会关心的工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2016-02-16
  • 1970-01-01
  • 2021-03-18
  • 2018-03-23
  • 2021-12-13
  • 2011-09-07
相关资源
最近更新 更多