SQL 错误“视图中的 ORDER BY 子句无效...”

Posted

技术标签:

【中文标题】SQL 错误“视图中的 ORDER BY 子句无效...”【英文标题】:SQL Error "The ORDER BY clause is invalid in views..." 【发布时间】: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。

【问题讨论】:

你对错误信息有什么不明白的地方? 【参考方案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:修复了查询。在子查询中添加别名。

以上是关于SQL 错误“视图中的 ORDER BY 子句无效...”的主要内容,如果未能解决你的问题,请参考以下文章

求解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!SQL Server 2012 出现以下错误:

ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束

oracle如何检查sql语法错误

SQL 错误 1064:您的 SQL 语法有错误

错误:您的 SQL 语法有错误 - 但 SQL 语句有效

sql 使用错误号处理SQL中的错误