【问题标题】:Use ORDER BY clause after WHERE in subquery在子查询中的 WHERE 之后使用 ORDER BY 子句
【发布时间】:2018-10-30 22:15:33
【问题描述】:

我有一个带有 UPDATE 语句的存储过程,如下所示:

UPDATE [Design]
SET [IsLocked] = 0
WHERE (SELECT [d].[DesignKey]
       FROM [project] AS [P]
       INNER JOIN [ProjectDesign] AS [PD] ON [P].[ProjectKey] = [pd].[ProjectKey]
       INNER JOIN [design] AS [d] ON [pd].[DesignKey] = [d].[DesignKey]
       WHERE [P].[Name] = @ProjectName
       ORDER BY [D].[DesignKey] DESC) = @DesignKey

但是当我尝试运行它时,我得到了这个错误:

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

我做错了什么?为什么我不能在子查询中使用ORDER BY?我该如何解决?

【问题讨论】:

  • 子查询中的order by子句不会有任何效果,即使它起作用了。
  • 问题是你为什么要在更新的子查询中使用ORDER BY???

标签: sql sql-server tsql


【解决方案1】:

为什么我不能在子查询中使用 ORDER BY?

因为它没有意义,除非你指定TOPOFFSET。如果您不使用这些限定符中的任何一个,为什么子查询的顺序很重要?

似乎您希望子查询中的 first 结果,这确实有意义,但您需要在子查询中添加 TOP 1

(SELECT TOP 1
...
ORDER BY ...) = @DesignKey

或使用MAX:

(SELECT
   MAX([d].[DesignKey])
   ...
 ) = @DesignKey

【讨论】:

    【解决方案2】:

    如果您需要使用 order by 子句更新子查询的唯一顶部记录。使用下面的子查询。

        (SELECT LAST 1
        ...
        ORDER BY ASC) = @DesignKey
    
    Else if you need to update all the subquery records , use below query
    
    UPDATE [Design]
    SET [IsLocked] = 0
    WHERE [DesignKey] 
    in
    (SELECT distinct [d].[DesignKey]
    FROM [project] AS [P]
    INNER JOIN [ProjectDesign] AS [PD] ON [P].[ProjectKey] = [pd].ProjectKey]
    INNER JOIN [design] AS [d] ON [pd].[DesignKey] = [d].[DesignKey]
    WHERE [P].[Name] = @ProjectName
    ORDER BY [D].[DesignKey] DESC)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多