2009-06-12 61 views
52

我與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在子查詢中?

回答

77

這是你的錯誤(重點煤礦):

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

3

您不需要在您的子查詢中排序。將它移出主查詢,並在子查詢中包含要排序的列。

但是,您的查詢只是返回一個計數,所以我沒有看到訂單的點。

2

在這個例子中,排序並沒有添加任何信息 - 一個集合的COUNT與它所處的順序是相同的!

如果你選擇的是沒有取決於訂單的東西,你需要做的事情之一錯誤消息告訴你 - 用TOP或FOR XML

1

子查詢(嵌套視圖),你必須返回一個數據集,然後可以順序您的電話查詢。訂購子查詢本身不會影響您的調用查詢中結果的順序(可靠)。

至於你的SQL本身: a)我沒有看到訂單的理由,因爲你正在返回一個單一的值。 b)我沒有看到子查詢的理由,因爲你只返回一個單一的值。

我猜這裏有很多更多的信息,你可能想告訴我們爲了解決你的問題。

4

top命令添加到您的子查詢...

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

:)

29

除了這個事實,爲了通過似乎沒有什麼意義在查詢.... 要在子選擇中使用順序,您需要使用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

希望這有助於 帕特里克

2

也許這個把戲會幫助某人

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下令在這裏內部子查詢(可以是任何從表中)

1

嘗試通過條款外子選擇移動的順序,並通過現場子添加的順序選擇



SELECT * FROM 

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

ORDER BY refKlinik_id 

1

對於我這個解決方案正常工作,以及:

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

如果建立一個臨時表,從臨時表的代碼塊外內移動ORDER BY子句。

不允許:

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

允許:

SELECT * FROM (
SELECT A FROM Y 
) X 
ORDER BY X.A; 
7

如果你使用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 
0

我使用此代碼來獲取頂級其次工資

我還可以得到錯誤,如

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