首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server TOP ... WITH TIES 詳細解析:語法規則、實戰演示與常見錯誤

     編輯:關於SqlServer

WITH TIES 是 TOP 子句的擴展選項,必須配合 ORDER BY 使用。其語義:若第 N 行(按排序鍵)與第 N+1、N+2... 行的排序鍵值相等,則將這些「平局」行一併返回,避免任意截斷導致業務邏輯不一致。

語法結構

SELECT TOP (n) [PERCENT] WITH TIES 
FROM 
ORDER BY ;

實戰演示環境

CREATE TABLE dbo.PeopleInfo (
    id INT IDENTITY(1,1) PRIMARY KEY,
    [name] NCHAR(10),
    numb NCHAR(10) NOT NULL,
    phone NCHAR(10)
);

INSERT INTO dbo.PeopleInfo([name],numb,phone) VALUES
(N'李歡',N'3223',N'1365255'),
(N'李歡',N'322123',N'1'),
(N'李名',N'3213112352',N'13152'),
(N'李名',N'32132312',N'13342563');

場景對比

1. 無 WITH TIES(TOP 3)

SELECT TOP 3 * FROM dbo.PeopleInfo ORDER BY [name] DESC;

按姓名降序:李名(2行)、李歡(2行)。TOP 3 只取前 3 行 → 返回 2 行「李名」+ 1 行「李歡」。

2. 有 WITH TIES(TOP 3 WITH TIES)

SELECT TOP 3 WITH TIES * FROM dbo.PeopleInfo ORDER BY [name] DESC;

第 3 行是「李歡」,第 4 行同為「李歡」(排序鍵相等)→ 觸發 TIES 機制,返回全部 4 行。

三大錯誤用法(均會報錯)

錯誤寫法錯誤原因
SELECT TOP 3 WITH TIES * FROM PeopleInfo;缺少 ORDER BY,無法判斷「平局」
SELECT WITH TIES * FROM PeopleInfo ORDER BY [name];缺少 TOP,語法不完整
SELECT WITH TIES * FROM PeopleInfo;同時缺少 TOP 與 ORDER BY

應用場景

  • 分頁查詢:確保同分數學生不被拆分到不同頁。
  • 排名報表:前 10 名若有並列,全部顯示。
  • 數據採樣:按權重排序取樣時,保證同權重樣本完整性。

效能提示

WITH TIES 會額外掃描排序鍵相等的行,大數據量時若排序列基數極低(大量重複值),可能返回遠超 TOP N 的行數,導致記憶體/網絡壓力驟增。建議:

  1. 在排序列上建立索引。
  2. 評估「平局行數」預估值,必要時改用 ROW_NUMBER() OVER (PARTITION BY sort_key ORDER BY ...) 精確控制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved