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 
+1

这并不ORDER BY,如果指定顶部99.99999%的IT工作正常 – foz1284 2013-07-03 09:41:21

+0

@ foz1284你能指出一些文件或参考证实了这一说法? – Tomalak 2013-07-03 10:54:38

+10

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

您不需要在您的子查询中排序。将它移出主查询,并在子查询中包含要排序的列。

但是,您的查询只是返回一个计数,所以我没有看到订单的点。

在这个例子中,排序并没有添加任何信息 - 一个集合的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