在子查询中使用Order By的SQL错误

我正在使用SQL Server 2005。

我的查询是:

SELECT ( SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4 GROUP BY refKlinik_id ORDER BY refKlinik_id ) as dorduncuay 

而错误:

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

如何在子查询中使用ORDER BY

这是你得到的错误(重点是我的):

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

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

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

除了顺序在您的查询中似乎没有意义的事实….要使用顺序在子select您将需要使用TOP 2147483647。

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

我的理解是,“TOP 100 PERCENT”不保证从SQL 2005开始订购:

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

请参阅SQL Server 2005重大更改

希望这有助于帕特里克

将顶部命令添加到您的子查询…

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

🙂

如果您正在使用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 

你不需要在你的子查询中进行sorting。 将其移出到主查询中,并在子查询中包含要sorting的列。

然而,你的查询只是返回一个计数,所以我没有看到的顺序点。

在这个例子中,sorting并没有添加任何信息 – 一个集合的COUNT与它所处的顺序是一样的!

如果您select的是依赖于顺序的东西,则需要执行错误消息告诉您的其中一项 – 使用TOP或FOR XML

也许这个把戏会帮助别人

 SELECT [id], [code], [created_at] FROM ( SELECT [id], [code], [created_at], (ROW_NUMBER() OVER ( ORDER BY created_at DESC)) AS Row FROM [Code_tbl] WHERE [created_at] BETWEEN '2009-11-17 00:00:01' AND '2010-11-17 23:59:59' ) Rows WHERE Row BETWEEN 10 AND 20; 

这里内部子查询按字段created_atsorting(可以是你的表中的任何)

子查询(嵌套视图)就像返回数据集一样,然后可以在调用查询中进行订购。 订购子查询本身不会影响您的调用查询结果的顺序。

至于你的SQL本身:a)我没有看到订单的理由,因为你正在返回一个单一的值。 b)无论如何,我没有看到子查询的理由,因为你只是返回一个单一的值。

我猜这里有更多的信息,你可能想告诉我们,以解决你的问题。

尝试在子select之外移动order by子句,并在子select中按字段添加顺序

 SELECT * FROM (SELECT COUNT(1) ,refKlinik_id FROM Seanslar WHERE MONTH(tarihi) = 4 GROUP BY refKlinik_id) as dorduncuay ORDER BY refKlinik_id 

对我来说,这个解决scheme工作的很好:

 SELECT tbl.a, tbl.b FROM (SELECT TOP (select count(1) FROM yourtable) a,b FROM yourtable order by a) tbl 

如果构build临时表,则将临时表代码块内的ORDER BY子句移到外部。

不允许:

 SELECT * FROM ( SELECT A FROM Y ORDER BY YA ) X; 

允许:

 SELECT * FROM ( SELECT A FROM Y ) X ORDER BY XA;