【问题标题】:Error: The order by clause is invalid in views错误:视图中的 order by 子句无效
【发布时间】:2019-02-27 16:02:30
【问题描述】:

我在尝试基于 4 个表构建视图的 SQL Server 14 中遇到以下错误

ORDER BY 子句在视图、内联函数、派生中无效 表、子查询和公用表表达式,除非 TOP、OFFSET 或 FOR XML 也被指定

如何解决以下问题,以免出现此错误?

SELECT        dbo.PS_Proj.[Project ID],
            case 
            when PS_Proj.[City Name] is not null then  concat(PS_Proj.[City Name], ' ', PS_Proj.[State])
            when PS_Billing.[Location] is not null then max(PS_Billing.[Location])
            when PS_Time.[Labor Location ID] is not null then max(PS_Location.[Labor Location Name])
            else null
            end AS [Location]
FROM        dbo.PS_Location RIGHT OUTER JOIN
                     dbo.PS_Time ON dbo.PS_Location.[Labor Location ID] = dbo.PS_Time.[Labor Location ID] RIGHT OUTER JOIN
                     dbo.PS_Proj ON dbo.PS_Time.[Project ID] = dbo.PS_Proj.[Project ID] LEFT OUTER JOIN
                     dbo.PS_Billing ON dbo.PS_Proj.[Project ID] = dbo.PS_Billing.[Project ID]
ORDER BY    PS_Billing.[T/S Date], PS_Time.[Date]

我想显示最近的 PS_Billing 位置,如果它为空,则显示最近的 PS_Time 位置。

【问题讨论】:

  • 如果您正在创建视图,请删除 orber 并将结果从视图上的选择中排序,,
  • 您正在尝试创建视图,但在创建视图时无法应用 ORDER BY。不过,您可以在从视图中选择时应用您的 ORDER BY。
  • 或许select top 100 %?
  • 将 ORDER BY 子句从您的视图中移除。
  • @SeanLange:有些人试图变得聪明,不会使用 100%,而是使用 99.99999999999999 :-)

标签: sql sql-server


【解决方案1】:

在没有 Order By 的情况下创建您的视图。删除 ORDER BY PS_Billing.[T/S Date], PS_Time.[Date] 并将它们添加到您的 SELECT 中。

SELECT     
PS_Billing.[T/S Date] AS TsDate, 
PS_Time.[Date] AS Date,
 dbo.PS_Proj.[Project ID],
            case 
            when PS_Proj.[City Name] is not null then  concat(PS_Proj.[City Name], ' ', PS_Proj.[State])
            when PS_Billing.[Location] is not null then max(PS_Billing.[Location])
            when PS_Time.[Labor Location ID] is not null then max(PS_Location.[Labor Location Name])
            else null
            end AS [Location]
FROM        dbo.PS_Location RIGHT OUTER JOIN
                     dbo.PS_Time ON dbo.PS_Location.[Labor Location ID] = dbo.PS_Time.[Labor Location ID] RIGHT OUTER JOIN
                     dbo.PS_Proj ON dbo.PS_Time.[Project ID] = dbo.PS_Proj.[Project ID] LEFT OUTER JOIN
                     dbo.PS_Billing ON dbo.PS_Proj.[Project ID] = dbo.PS_Billing.[Project ID] 

并从您的视图中按行顺序选择

Select FROM YOUR_VIEW_NAME as V
Order By V.TsDate, V.Date

【讨论】:

  • 当我这样做时,我会得到重复的行,因为每个项目 id 有 5 到 3000 个不同的日期或 T/S 日期。在没有所有重复行的情况下如何做到这一点?
  • 这是一个不同的问题,与错误订购无关。您应该使用“group by”对项目进行分组
  • 我没有添加 [T/S Date] 和 [Date] 的原因是我没有得到与它们关联的额外行 - 有意义吗?否则解决方案没有意义。不幸的是,这不是正确的答案。
  • 实际上没有意义。我没有更改您的查询,我只是按照您的视图定义进行排序。添加新字段以选择不会导致重复记录。想想下面的例子。 Id 姓名生日 1 Abc 2001 年 1 月 1 日 2 Abcd 2002 年 2 月 2 日 SELECT Name FROM User where Name ='Abc' SELECT Name, Birthday FROM User where Name ='Abc' 两个结果都将有 1 条记录 Id=1
【解决方案2】:

您的案例表达式中有一些聚合数据,但您没有分组依据。我在这里做一些猜测。此外,您应该养成使用别名的习惯,这会使事情变得简单得多。我还建议不要在列名中添加空格,因为它会迫使您不断将列括在方括号中。

这样的事情应该会让你接近。

SELECT p.[Project ID]
    , MAX(case 
        when p.[City Name] is not null then concat(p.[City Name], ' ', p.[State])
        when b.[Location] is not null then b.[Location]
        when t.[Labor Location ID] is not null then l.[Labor Location Name]
        else null
    end) AS [Location]
FROM dbo.PS_Location l
RIGHT OUTER JOIN dbo.PS_Time t ON l.[Labor Location ID] = t.[Labor Location ID] 
RIGHT OUTER JOIN dbo.PS_Proj  p ON t.[Project ID] = p.[Project ID]
LEFT OUTER JOIN dbo.PS_Billing b ON p.[Project ID] = b.[Project ID]
GROUP BY p.[Project ID]

【讨论】:

  • 我将 case 语句添加到 group by 并得到大量错误,如下所示: 'dbo.PS_Proj.City Name' 在选择列表中无效,因为它不包含在任一聚合函数中或 GROUP BY 子句。
  • 如果我像这样单独添加所有内容:GROUP BY 项目 ID、城市名称、州、位置...我会得到我试图避免的重复行。如何在没有重复行的情况下执行此操作?
  • 不要按其他列分组。它们是聚合的。
  • 当我删除应该聚合的行时,我收到关于城市名称、位置和劳动力位置 ID 的错误:在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY 子句
  • @TAD 我稍微更改了查询,但我主要是猜测,因为我没有可使用的表。
猜你喜欢
  • 2011-08-22
  • 2016-02-16
  • 2014-01-12
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多