子查询中的Order By的SQL错误

cag*_*gin 63 sql-server sql-order-by

我正在使用SQL Server 2005.

我的查询是:

SELECT (
  SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay
Run Code Online (Sandbox Code Playgroud)

而错误:

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

如何ORDER BY在子查询中使用?

Tom*_*lak 103

这是你得到的错误(强调我的):

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

那么,你怎么能避免这个错误呢?通过指定TOP,我想是一种可能性.

SELECT (
  SELECT TOP 100 PERCENT
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay
Run Code Online (Sandbox Code Playgroud)

  • http://blogs.msdn.com/b/queryoptteam/archive/2006/03/24/560396.aspx如此处所解释的那样,TOP 100%没有订单,因为它保证在SQL Server是时返回所有行hovever评估前99需要执行命令以确保它返回正确的行. (10认同)
  • 如果您指定最高99.99999%,则不会按顺序排序,它可以按预期工作 (2认同)

Pat*_*olf 33

除了订单在您的查询中似乎没有意义的事实....要在子选择中使用order by,您将需要使用TOP 2147483647.

SELECT (
  SELECT TOP 2147483647
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay
Run Code Online (Sandbox Code Playgroud)

我的理解是"TOP 100 PERCENT"不再保证从SQL 2005开始订购:

在SQL Server 2005中,视图定义中的ORDER BY子句仅用于确定TOP子句返回的行.查询视图时,ORDER BY子句不保证有序结果,除非在查询本身中也指定了ORDER BY.

请参阅SQL Server 2005中断更改

希望这有帮助,帕特里克


Jez*_*Jez 21

如果您正在使用SQL Server 2012或更高版本,现在可以轻松修复此问题.添加offset 0 rows:

SELECT (
  SELECT
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id OFFSET 0 ROWS
) as dorduncuay
Run Code Online (Sandbox Code Playgroud)

  • 在过去 20 分钟内我一直在寻找的所有答案中,这是唯一解决我的问题的答案。 (2认同)
  • 为什么添加“offset 0 rows”会神奇地使“order by”起作用?这个语句给查询规划器带来什么不同? (2认同)

Mac*_*ver 7

如果构建临时表,请将 ORDER BY 子句从临时表代码块内部移到外部。

不允许:

SELECT * FROM (
SELECT A FROM Y
ORDER BY Y.A
) X;
Run Code Online (Sandbox Code Playgroud)

允许:

SELECT * FROM (
SELECT A FROM Y
) X
ORDER BY X.A;
Run Code Online (Sandbox Code Playgroud)


cjk*_*cjk 5

您的子查询中不需要 order by。将其移到主查询中,并在子查询中包含要排序的列。

但是,您的查询只是返回一个计数,所以我看不到 order by 的意义。