TOP WITH TIES 必须与 ORDER BY 配合使用,确保排序后并列记录一并返回;不支持 PERCENT,且返回行数可能超过指定值。

在 SQL Server 2022 中,TOP WITH TIES 用于确保排序后并列的记录一并返回,避免因截断导致关键数据丢失。它必须和 ORDER BY 一起使用,否则报错。
基本语法与前提条件
正确写法是:
SELECT TOP (n) WITH TIESFROM ORDER BY
[ASC|DESC] WITH TIES不支持PERCENT;若加了PERCENT,SQL Server 会直接报错- 排序列必须明确、稳定;如果
ORDER BY后有多列(如ORDER BY score DESC, id ASC),可减少“意外并列”什么时候需要 WITH TIES
典型场景是业务上要求“取前 N 名,同分全进”。例如:
- 销售榜取 Top 5,但第 5 名有三人并列 92 分 → 实际返回 7 行
- 学生成绩查询取前 10%,但最后一名分数有多个学生 → 所有同分者都包含
- 空间查询中找最近的 3 个网点,若第 3 近的距离值相同,需全部返回
常见错误与避坑点
容易出错的操作包括:
- 漏写
ORDER BY:SQL Server 报错 “The TOP … WITH TIES clause requires an ORDER BY clause.” - 在视图或内联表函数中用了
WITH TIES却没带ORDER BY:同样失败 - 排序列存在大量 NULL:NULL 在默认排序中被视为相等,可能意外触发多行返回
- 误以为返回行数一定等于
n:实际可能更多,应用层要能处理动态行数
结合空间查询的特殊用法
在地理信息类查询中,
TOP WITH TIES可用于最近邻搜索,但要注意:- 必须用
STDistance()在ORDER BY中排序 -
WHERE子句中也应包含STDistance() 来配合空间索引 -
TOP后不能跟PERCENT,否则语法不被接受 - 示例:
SELECT TOP (3) WITH TIES *, location.STDistance(@point) AS dist<br> FROM stores<br> WHERE location.STDistance(@point) IS NOT NULL<br> ORDER BY location.STDistance(@point);










