在子查询中使用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;