【问题标题】:SQL Error "The ORDER BY clause is invalid in views..."SQL 错误“视图中的 ORDER BY 子句无效...”
【发布时间】:2011-08-22 04:44:08
【问题描述】:

我正在尝试解决一个 SQL Server 错误。有人可以帮帮我吗?

查询是:

SELECT TOP 10 * 
FROM ( 
SELECT c.id, c.name, c.inserteddate, c.cityname, ftblstates.name AS statename, clc.name AS catname, '' AS listingimagelogo, '' AS orgname, relocateyn, '' AS employerclassified
FROM ((tblclassifieds c 
LEFT JOIN tblclassifiedscategories clc ON c.categoryid = clc.id) 
LEFT JOIN ftblstates ON c.stateid = ftblstates.id) 
WHERE (c.expirydate != '') AND NOT c.id IN ( 
SELECT TOP 10 tblclassifieds.id 
FROM tblclassifieds 
WHERE (c.expirydate != '') 
ORDER BY inserteddate desc) 
UNION ALL 
SELECT ce.id, ce.name, ce.inserteddate, suburb AS cityname, ftblstates.name AS statename, ce.jobtype AS catname, ce.listingimagelogo, ce.orgname, '' AS relocateyn, '1' AS employerclassified 
FROM tblclassifiedemployers ce 
LEFT JOIN ftblstates ON ce.stateid = ftblstates.id 
WHERE (ce.expirydate != '') AND NOT ce.id IN ( 
SELECT TOP 10 tblclassifiedemployers.id 
FROM tblclassifiedemployers 
WHERE (ce.expirydate != '') 
ORDER BY inserteddate desc) 
ORDER BY inserteddate desc; 

还有错误:

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

【问题讨论】:

  • 你对错误信息有什么不明白的地方?

标签: sql windows-server-2008


【解决方案1】:

使用这个:

create view Department_View
as
select Name from [HumanResources].[Department]
order by Name offset 0 rows

【讨论】:

    【解决方案2】:

    如果您使用的是 SQL Server 2012 或更高版本,请在 order by 后使用“offset 0 rows”。 前 -

    create view Department_View
    as
    select Name from [HumanResources].[Department]
    order by Name offset 0 rows
    

    【讨论】:

      【解决方案3】:

      我使用了以下结构:

      SELECT
          ROW_NUMBER() OVER (ORDER BY LASTNAME) SORTORDER,
          *
      FROM
          CLIENT
      

      【讨论】:

        【解决方案4】:
        CREATE FUNCTION GetUnitIDWithScenarioCount
        (
        @calculatorType int
        )
        returns TABLE as
        return
        (
        select count,unitid from(
         SELECT Top 1
                 count(sc.UnitId) as count, sc.unitid
                   FROM scenarios SC 
            INNER JOIN npcstatus NPC
                ON NPC.UnitId=SC.UnitId
            INNER JOIN IPEDSCollegeData..hd hd
                ON hd.UnitId=NPC.UnitId
                WHERE npc.calculatorType=4
                Group by sc.unitid
            ) as temp
            order by count
            )
        

        【讨论】:

          【解决方案5】:

          如上所述,ORDER BY 不得出现在子查询中,除非使用 TOP 或 FOR XML。

              SELECT TOP 10 * FROM ( 
              SELECT 
                  c.id, 
                  c.name, 
                  c.inserteddate, 
                  c.cityname, 
                  ftblstates.name AS statename, 
                  clc.name AS catname, 
                  '' AS listingimagelogo, 
                  '' AS orgname, relocateyn, 
                  '' AS employerclassified
              FROM tblclassifieds c 
              LEFT JOIN tblclassifiedscategories clc ON c.categoryid = clc.id
              LEFT JOIN ftblstates ON c.stateid = ftblstates.id 
              WHERE c.expirydate != ''
              AND NOT c.id IN ( 
                  SELECT TOP 10 
                      tblclassifieds.id 
                  FROM tblclassifieds 
                  WHERE c.expirydate != ''
                  ORDER BY inserteddate desc 
              ) 
              UNION ALL
              SELECT 
                  ce.id, 
                  ce.name, 
                  ce.inserteddate, 
                  suburb AS cityname, 
                  ftblstates.name AS statename, 
                  ce.jobtype AS catname, 
                  ce.listingimagelogo, 
                  ce.orgname, '' AS relocateyn, 
                  '1' AS employerclassified 
              FROM tblclassifiedemployers ce 
              LEFT JOIN ftblstates ON ce.stateid = ftblstates.id 
              WHERE ce.expirydate != ''
              AND NOT ce.id IN ( 
                  SELECT TOP 10 
                      tblclassifiedemployers.id 
                  FROM tblclassifiedemployers 
                  WHERE ce.expirydate != ''
                  ORDER BY inserteddate desc
              )
          ) a ORDER BY inserteddate desc;
          

          【讨论】:

          • 通过删除两个额外的 order by 子句,我收到此错误:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP 或 FOR XML 也是指定。
          • @hallie - ORDER BY 可以出现在子查询中。您只需要在子查询中有 TOP 或 FOR XML,OP 似乎有。
          • @Biggs:对不起,我更新了脚本。抱歉,我没有数据,无法运行。 @Ben:你能再试一次吗?我删除了一些括号。
          • 快到了!现在我收到错误:';' 附近的语法不正确。
          • @Ben:修复了查询。在子查询中添加别名。
          猜你喜欢
          • 1970-01-01
          • 2016-02-16
          • 2014-01-12
          • 1970-01-01
          • 2016-08-27
          • 1970-01-01
          • 2021-12-13
          • 2021-03-18
          • 1970-01-01
          相关资源
          最近更新 更多