TOP WITH TIES 必须配合 ORDER BY 使用,返回排序后与第 N 行值相同的全部行,行数不固定;它适用于“达标即取”场景,而非精确分页。

TOP WITH TIES 会返回排序后“并列末位”的所有行,但必须搭配 ORDER BY,否则语法报错。
TOP WITH TIES 必须和 ORDER BY 一起用
单独写 SELECT TOP 5 WITH TIES * 会直接报错:Incorrect syntax near the keyword 'WITH'。SQL Server 强制要求 WITH TIES 出现在 ORDER BY 存在的前提下。
原因不是“习惯”,而是语义依赖:没有排序,就无法定义“谁和谁并列”——WITH TIES 的逻辑是“把和第 N 行 ORDER BY 值相同的全部拉进来”,N 由 TOP 指定,值由 ORDER BY 决定。
- 错误写法:
SELECT TOP 3 WITH TIES * FROM students - 正确写法:
SELECT TOP 3 WITH TIES * FROM students ORDER BY score DESC - 即使
ORDER BY列有大量重复值(比如全是 100),只要语法合规,就能执行
返回行数可能超过 TOP 指定的数字
这是 WITH TIES 最容易被误判的地方:它不保证只返回 N 行,而是“至少 N 行”。如果第 N 行的排序值(比如 score = 90)在后续行中还出现多次,这些行全算“并列”,一并返回。
例如表中有 5 条 score = 90 的记录,且它们在 ORDER BY score DESC 下排在第 3–7 位,则 TOP 3 WITH TIES 实际返回 7 行。
- 结果集大小不可预测,不能用于需要严格行数限制的场景(如分页)
- 若需稳定返回 N 行,请改用
OFFSET 0 ROWS FETCH NEXT N ROWS ONLY -
WITH TIES返回的“并列行”之间无固定顺序,ORDER BY不控制它们的相对位置
PERCENT 和 WITH TIES 能共存,但要小心四舍五入
TOP (20) PERCENT WITH TIES 是合法语法,但要注意:SQL Server 先按百分比计算目标行数(小数向上取整),再基于该行号找并列项。
比如总 13 行,20% 是 2.6 → 向上取整为 3 → 实际以第 3 行的 ORDER BY 值为锚点找并列 —— 这和 TOP 3 WITH TIES 行为一致。
- 不要假设
PERCENT能规避“超量返回”,它只是改变了初始锚点行号的计算方式 -
TOP (1) PERCENT在小表(如 50 行以内)可能始终返回 1 行,但一旦跨过临界点(如 101 行 → 取 2 行),并列逻辑立刻生效 - 表达式变量(如
TOP (@n) WITH TIES)同样适用,但@n必须是整数或可转成整数的类型
真正要用好 TOP WITH TIES,得接受它本质是个“模糊截断”工具:你要的不是精确数量,而是“所有达到某门槛的记录”。一旦开始纠结返回了几行,大概率说明场景选错了——这时候该切到 OFFSET/FETCH 或加唯一排序键补救。

















