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');
SELECT TOP 3 * FROM dbo.PeopleInfo ORDER BY [name] DESC;
按姓名降序:李名(2行)、李歡(2行)。TOP 3 只取前 3 行 → 返回 2 行「李名」+ 1 行「李歡」。
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 |
WITH TIES 會額外掃描排序鍵相等的行,大數據量時若排序列基數極低(大量重複值),可能返回遠超 TOP N 的行數,導致記憶體/網絡壓力驟增。建議:
ROW_NUMBER() OVER (PARTITION BY sort_key ORDER BY ...) 精確控制。