如何在子查询中使用ORDER BY

时间:2014-09-20 06:35:26

标签: sql sql-server sql-server-2008 tsql

update dbo.Sheet1$ set F01 = 0 where ID in(
select top 3 ID from dbo.Sheet1$ where ID in(
select ID, ISNULL(F01,0) + ISNULL(F02,0) + ISNULL(F03,0) as RowSum 
   from dbo.Sheet1$ where F01 = 1 AND F02 = 1 order by RowSum desc))

运行此代码我收到错误消息:

  

Msg 1033,Level 15,State 1,Line 1 ORDER BY子句无效   视图,内联函数,派生表,子查询和公用表   表达式,除非还指定了TOP,OFFSET或FOR XML。

我可以编写另一个与上述查询完全相同的查询吗?

2 个答案:

答案 0 :(得分:1)

您的查询比没有采样的订购有更多问题。例如,当您在IN ()谓词中使用子查询时,它不能返回超过1列,而您返回2列。

检查一下,也许我猜错了:

update dbo.Sheet1$ set F01 = 0
where ID in (
    select top 3 ID
    from dbo.Sheet1$
    where F01 = 1 AND F02 = 1
    order by ISNULL(F01,0) + ISNULL(F02,0) + ISNULL(F03,0) desc
);

答案 1 :(得分:0)

错误的两个可能原因是:

1)您的子查询具有条件IN,它尝试在子查询中查找2列,而在查询IN时只能有1列

2)您的子查询不能使用Order By,因为无论您是否要进行排序,它都会查找子查询结果集中的匹配记录并更新记录。因此,在子查询中使用Order By没有任何意义。无论您是在子查询中保留Order By还是删除Order By,它都会为您提供相同的输出。

希望这有帮助!