with ties必须与order by联用,返回第n名及所有同分行,不保证行数;null被视为相等;不可与offset-fetch共存。

WITH TIES 必须和 ORDER BY 一起用,单独写会报错
直接在 SELECT TOP(1) 后加 WITH TIES 是无效的,SQL Server 会抛出错误:「Incorrect syntax near the keyword 'WITH'」。根本原因是 WITH TIES 不是独立语法,它依赖排序结果中的值重复性来判断“并列”,没有 ORDER BY 就没有“排名”概念,自然无法识别哪些行该被“连带”返回。
常见错误写法:
SELECT TOP(1) WITH TIES Name, Score FROM Students;
正确写法必须补全 ORDER BY,且排序字段需有实际区分度(比如分数):
SELECT TOP(1) WITH TIES Name, Score FROM Students ORDER BY Score DESC;
TOP n WITH TIES 返回的是“第n名及所有并列者”,不是“前n名”
这是最容易误解的一点:TOP(3) WITH TIES 不保证只返回 3 行。它先按 ORDER BY 排序,取第 3 名对应的那个值(比如 Score = 92),然后把所有 Score = 92 的行都拉进来——哪怕总共 7 行。
- 如果第 3、4、5 名都是 92 分,那结果就是 5 行
- 如果第 3 名是唯一 92 分,第 4 名是 91 分,那结果就是恰好 3 行
- 如果前 10 名全是 100 分,
TOP(1) WITH TIES会返回全部 10 行
所以它适合“取最高分所有人”“取销量并列 Top 5 的商品”这类业务场景,不适合需要严格控制返回行数的分页或接口限流。
NULL 值在 WITH TIES 中会被当作相等处理
SQL Server 默认把所有 NULL 视为相同值。这意味着如果排序字段存在 NULL,而它们恰好落在临界位置(比如第 3 名是 NULL),那么所有该字段为 NULL 的行都会被一并返回。
例如:
SELECT TOP(2) WITH TIES ProductName, ListPrice FROM Production.Product ORDER BY ListPrice DESC;
若第 2 名和第 5、8、12 名的 ListPrice 都是 NULL,这条语句会返回至少 4 行——即使你只想要价格最高的两个非空值。
规避方法只有显式过滤:
WHERE ListPrice IS NOT NULL
WITH TIES 和 OFFSET-FETCH 不能共存
SQL Server 明确禁止在同一个查询中同时使用 TOP(含 WITH TIES)和 OFFSET-FETCH。如果你需要“跳过前 20 行,再取并列第 21 名的所有人”,得拆成两步:先用子查询或 CTE 算出第 21 名的临界值,再用 WHERE + = 匹配。
错误示例:
SELECT TOP(5) WITH TIES * FROM Orders ORDER BY TotalAmount DESC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
这会触发错误:The TOP clause cannot be used together with OFFSET and FETCH.
真正要实现“分页+并列”的逻辑,核心是先拿到临界值(比如第 21 名的金额),再查所有等于该值的记录——WITH TIES 只解决“排序后取头N带并列”,不解决“从中间某段开始取并列”。










