SQL错误通过子查询
我与SQL Server 2005工作SQL错误通过子查询
我的查询是:
SELECT (
SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
和错误:
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
如何使用ORDER BY
在子查询中?
这是你的错误(重点煤矿):
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
那么,你怎么能避免这个错误呢?通过指定TOP,我猜可能是一种可能性。
SELECT (
SELECT TOP 100 PERCENT
COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
GROUP BY refKlinik_id
ORDER BY refKlinik_id
) as dorduncuay
您不需要在您的子查询中排序。将它移出主查询,并在子查询中包含要排序的列。
但是,您的查询只是返回一个计数,所以我没有看到订单的点。
在这个例子中,排序并没有添加任何信息 - 一个集合的COUNT与它所处的顺序是相同的!
如果你选择的是没有取决于订单的东西,你需要做的事情之一错误消息告诉你 - 用TOP或FOR XML
子查询(嵌套视图),你必须返回一个数据集,然后可以顺序您的电话查询。订购子查询本身不会影响您的调用查询中结果的顺序(可靠)。
至于你的SQL本身: a)我没有看到订单的理由,因为你正在返回一个单一的值。 b)我没有看到子查询的理由,因为你只返回一个单一的值。
我猜这里有很多更多的信息,你可能想告诉我们为了解决你的问题。
top命令添加到您的子查询...
SELECT
(
SELECT TOP 100 PERCENT
COUNT(1)
FROM
Seanslar
WHERE
MONTH(tarihi) = 4
GROUP BY
refKlinik_id
ORDER BY
refKlinik_id
) as dorduncuay
:)
除了这个事实,为了通过似乎没有什么意义在查询.... 要在子选择中使用顺序,您需要使用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%的” 不出示担保订货开始了与SQL 2005:
In SQL Server 2005, the ORDER BY clause in a view definition is used only to determine the rows that are returned by the TOP clause. The ORDER BY clause does not guarantee ordered results when the view is queried, unless ORDER BY is also specified in the query itself.
见SQL Server 2005 breaking changes
希望这有助于 帕特里克
也许这个把戏会帮助某人
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_at下令在这里内部子查询(可以是任何从表中)
尝试通过条款外子选择移动的顺序,并通过现场子添加的顺序选择
SELECT * FROM
(SELECT COUNT(1) ,refKlinik_id FROM Seanslar WHERE MONTH(tarihi) = 4 GROUP BY refKlinik_id)
as dorduncuay
ORDER BY refKlinik_id
对于我这个解决方案正常工作,以及:
SELECT tbl.a, tbl.b
FROM (SELECT TOP (select count(1) FROM yourtable) a,b FROM yourtable order by a) tbl
如果建立一个临时表,从临时表的代码块外内移动ORDER BY子句。
不允许:
SELECT * FROM (
SELECT A FROM Y
ORDER BY Y.A
) X;
允许:
SELECT * FROM (
SELECT A FROM Y
) X
ORDER BY X.A;
如果你使用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
我使用此代码来获取顶级其次工资
我还可以得到错误,如
ORDER BY子句在视图,内联函数,派生表无效,子查询和公用表表达式,除非还指定了TOP或FOR XML。
TOP 100我用来避免错误
SELECT * FROM( 选择tbl.Coloumn1,CONVERT(VARCHAR,ROW_NUMBER()OVER(ORDER BY(选1)))AS Rowno从( 选择前100 *从表1 为了通过Coloumn1 DESC)为TBL)为TBL其中tbl.Rowno = 2
这并不ORDER BY,如果指定顶部99.99999%的IT工作正常 – foz1284 2013-07-03 09:41:21
@ foz1284你能指出一些文件或参考证实了这一说法? – Tomalak 2013-07-03 10:54:38
http://blogs.msdn.com/b/queryoptteam/archive/2006/03/24/560396.aspx正如这里解释的TOP 100百分之没有顺序,因为它是保证返回所有行hovever时SQL Server正在评估它需要执行的前99个命令,以确保它返回正确的行。 – foz1284 2013-07-05 06:24:20