2014-06-25 44 views
-2

有人可以幫我解釋爲什麼它不起作用嗎?Sql top x order

select top(10) * from 
(select * from dbticket order by 1 desc) a 

的錯誤是:

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified. 

我有這樣的IDS在第一科拉姆:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 

我需要有id爲這樣:

15 
14 
13 
12 
11.. 
+0

使用派生表外訂購的。 – Azar

+1

根據你的錯誤信息你的子查詢使用ORDER BY而不在子查詢本身中指定TOP。什麼是1的順序? – Kaf

+0

看看「除非」 - 部分。所以你可以使用'SELECT TOP(10)* FROM(SELECT TOP 100 PERCENT * FROM dbticket ORDER BY 1 DESC)a' –

回答

1

由於基本的T-SQL邏輯,這不起作用。 T-SQL是一個基於集合的理論,SET是指一個獨特的對象集合。所以FROM關鍵字在Sets上工作,但是當我們添加一個Order By子句時,我們得到的不是set,我們可以稱之爲CURSOR,也可以是更具說服力的「CURrent Set Of Row」。 因此,這解釋了你的問題..一旦你添加order by 1 desc任何數據得到select * from dbticket返回SET得到轉換爲Cursor這是不符合FROM Clause

希望這有助於!

,從而獲得所需結果寫爲:

;with CTE as 
(
select row_number() over (order by id desc) as rownum, --order by the first column ex: id 
name, id --select * columns 
from dbticket) 
select Top 10 name , id from CTE --give names of all the columns you need 
order by rownum asc; 

檢查示例代碼here.

+0

它按照我的意願運行,非常感謝 – Rudi

0
select top(10) * from 
(select * from dbticket order by 1 desc FOR XML AUTO) a 
+0

不起作用: 消息8155,級別16,狀態2,行2 沒有爲'a'的列1指定列名稱。 即使這樣做: 選擇頂(10)*從 上查詢,我給的答案一個 – Rudi

+0

耶築底(由id_ticket遞減FOR XML AUTO SELECT * FROM dbticket順序),但我們需要給列名 – mohan111

1

只需使用

SELECT TOP 10 * FROM dbticket ORDER BY 1 DESC 

子查詢不是必需的。

+0

是這樣的sql服務器首先執行「top 10」,然後執行「orde by」子句 – Rudi

+0

@RodolfoRollo - 請參閱「[SELECT]」的邏輯處理順序(http://msdn.microsoft.com/zh-cn/library/ms189499.aspx )聲明「。 'ORDER BY'是第10步.' TOP'是第11步。 –

0

試試這個

select * from 
(select top(10) * from dbticket order by 1 desc) a 
+0

Outer子查詢在你的解決方案中有什麼用處? – Deepshikha

+0

我相信整個場景是不會給jst需要的部分被質疑這是提供給問題提供的解決方案,可能是你可以使用的地方,或者它可能是什麼。但是,無論是在內部還是外部使用前10,都沒有區別。 – Azar

0

當你爲了在你的子查詢必須使用頂部的選項中在選擇你的查詢。您可以在查詢中使用Top 100 Percent以按順序排序從子查詢中獲取所有行。

例如:

select top(10) * from 
(select top 100 Percent * from dbticket order by 1 desc) a 

在您的樣品,你可以使用下面的查詢:

select * from 
(select top 10 * from dbticket order by 1 desc) a 

OR

select top 10 * from dbticket order by 1 desc