TOP (Transact-SQL)
指定只從查詢結果傳回第一組資料列。這組資料列可以是一個數字,也可以是資料列的百分比。SELECT、INSERT、UPDATE、MERGE 和 DELETE 陳述式可以使用 TOP 運算式。
語法
[
TOP (expression) [PERCENT]
[ WITH TIES ]
]
引數
expression
這是指定要傳回的資料列數目之數值運算式。如果指定了 PERCENT,expression 會隱含地轉換為 float 值;否則,它會轉換為 bigint。TOP 中用來分隔 expression 的括號,在 INSERT、UPDATE、MERGE 和 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。[!附註]
輸入記錄所傳回的順序是任意的。ORDER BY 不會影響這個規則。
備註
TOP 不能在資料分割檢視上,搭配 UPDATE 和 DELETE 陳述式來使用。
搭配 INSERT、UPDATE、MERGE 或 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;
SQL Server 可讓您更新利用 TOP 子句來建立的檢視。由於 TOP 子句包括在檢視定義中,因此,如果結果不再符合 TOP 運算式的需求,部分資料列可能會因更新而在檢視中消失。如需詳細資訊,請參閱<透過檢視修改資料>。
查詢中的 TOP 運算式不會影響因引發觸發程序而執行的陳述式。在觸發程序中,插入和更新的資料表只會顯示真正受 INSERT、UPDATE、MERGE 或 DELETE 陳述式影響的資料列。
在 MERGE 陳述式中使用 TOP
在 MERGE 陳述式中指定時,當整個來源資料表和整個目標資料表聯結在一起,而且不符合插入、更新或刪除動作的聯結資料列被移除後,就會套用 TOP 子句。TOP 子句會進一步將聯結的資料列數減少為指定的值,而且插入、更新或刪除動作會依照未排序的方式套用到剩餘的聯結資料列。也就是說,將資料列散發到 WHEN 子句中定義的動作時,沒有任何特定順序。例如,指定 TOP (10) 會影響 10 個資料列;在這些資料列中,可能會更新 7 個及插入 3 個,或者可能會刪除 1 個、更新 5 個及插入 4 個,依此類推。
因為 MERGE 陳述式會針對來源和目標資料表執行完整資料表掃描,所以當使用 TOP 子句,藉由建立多個批次來修改大型資料表時,I/O 效能可能會受到影響。在此案例中,確保所有後續批次都是以新的資料列為目標是很重要的一件事。如需詳細資訊,請參閱<最佳化 MERGE 陳述式效能>。
範例
A. 搭配變數使用 TOP
下列範例會利用變數來取得 AdventureWorks2008R2 資料庫的 dbo.Employee 資料表中所列出的前 10 位員工。
USE AdventureWorks2008R2;
GO
DECLARE @p AS int;
SELECT @p=10
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO
B. 搭配 PERCENT 和 WITH TIES 使用 TOP
下列範例會取得所有員工中薪資最高的 10%,且會依照薪資基底匯率的遞減順序傳回。指定 WITH TIES 可確定任何薪資是所傳回之最低薪資的員工也會包括在結果集中,即使這麼做會超出員工的 10%,也是如此。
USE AdventureWorks2008R2;
GO
SELECT TOP(10) PERCENT WITH TIES
pp.FirstName, pp.LastName, e.JobTitle, e.Gender, r.Rate
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN HumanResources.EmployeePayHistory AS r
ON r.BusinessEntityID = e.BusinessEntityID
ORDER BY Rate DESC;