TOP (Transact-SQL)

更新: 2008 年 11 月 17 日

指定只從查詢結果傳回第一組資料列。這組資料列可以是一個數字,也可以是資料列的百分比。SELECT、INSERT、UPDATE 和 DELETE 陳述式可以使用 TOP 運算式。

主題連結圖示Transact-SQL 語法慣例

語法

[ 
     TOP (expression) [PERCENT]
     [ WITH TIES ]
]

引數

  • expression
    這是指定要傳回的資料列數目之數值運算式。如果指定了 PERCENT,expression 會隱含地轉換為 float 值;否則,它會轉換為 bigint

    TOP 中用來分隔 expression 的括號,在 INSERT、UPDATE 和 DELETE 陳述式中是必要的。為了與舊版相容,支援在 SELECT 陳述式中使用不含括號的 TOP expression,但我們不建議您這麼做。

    如果查詢包括 ORDER BY 子句,就會傳回 ORDER BY 子句所排序的前 expression 個資料列,或 expression % 的資料列。如果查詢沒有 ORDER BY 子句,資料列的順序就是任意的。

  • PERCENT
    指出查詢只從結果集中傳回前 expression % 的資料列。
  • WITH TIES
    指定從基底結果集中傳回其他資料列,ORDER BY 資料行中的相同值顯示為 TOP n (PERCENT) 資料列中的最後一個。只有在 SELECT 陳述式中,且只在指定了 ORDER BY 子句時,才能指定 TOP...WITH TIES。

    ms189463.note(zh-tw,SQL.90).gif附註:
    繫結記錄的傳回順序是任意的。SORT BY 不會影響這項規則。

備註

TOP 不能在資料分割檢視上,搭配 UPDATE 和 DELETE 陳述式來使用。

搭配 INSERT、UPDATE 或 DELETE 使用的 TOP 運算式所參考的資料列並不依照任何順序來排列。TOP n 會傳回 n 個隨機資料列。例如,下列 INSERT 陳述式包含 ORDER BY 子句,但這個子句不會影響 INSERT 陳述式所直接參考的資料列。

INSERT TOP (2) INTO Table2 (ColumnB) 
     SELECT ColumnA FROM Table1 
     ORDER BY ColumnA

先前查詢中的 ORDER BY 子句只會參考巢狀 SELECT 陳述式所傳回的資料列。INSERT 陳述式會選擇 SELECT 陳述式所傳回的任兩個資料列。若要確定會從 SELECT 子查詢中插入前兩個資料列,請依照下列方式來重新撰寫查詢。

INSERT INTO Table2 (ColumnB) 
     SELECT TOP (2) ColumnA FROM Table1 
     ORDER BY ColumnA

Microsoft SQL Server 2005 可讓您更新利用 TOP 子句所建立的檢視表。由於 TOP 子句包括在檢視定義中,因此,如果結果不再符合 TOP 運算式的需求,部分資料列可能會因更新而在檢視中消失。如需詳細資訊,請參閱<透過檢視修改資料>。

查詢中的 TOP 運算式不會影響因引發觸發程序而執行的陳述式。在觸發程序中,插入和更新的資料表只會顯示真正受 INSERT、UPDATE 或 DELETE 陳述式影響的資料列。

範例

A. 搭配變數使用 TOP

下列範例會利用變數來取得 AdventureWorks 資料庫的 dbo.Employee 資料表中所列出的前 10 位員工。

USE AdventureWorks ;
GO
DECLARE @p AS int
SET @p='10'
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO

B. 搭配 PERCENT 和 WITH TIES 使用 TOP

下列範例會取得所有員工中薪資最高的 10%,且會依照薪資基底匯率的遞減順序傳回。指定 WITH TIES 可確定任何薪資是所傳回之最低薪資的員工也會包括在結果集中,即使這麼做會超出員工的 10%,也是如此。

USE AdventureWorks ;
GO
SELECT TOP(10) PERCENT WITH TIES
c.FirstName, c.LastName, e.Title, e.Gender, r.Rate
FROM Person.Contact c 
INNER JOIN HumanResources.Employee e
ON c.ContactID = e.ContactID
INNER JOIN HumanResources.EmployeePayHistory r
ON r.EmployeeID = e.EmployeeID
ORDER BY Rate DESC;

請參閱

參考

SELECT (Transact-SQL)
INSERT (Transact-SQL)
UPDATE (Transact-SQL)
DELETE (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2008 年 11 月 17 日

變更的內容:
  • 在 WITH TIES 引數描述中,新增注意事項。

2005 年 12 月 5 日

變更的內容:
  • 更新範例 B。