如何让 OFFSET/FETCH 和 WITH TIES 在一起?
How to have OFFSET/FETCH and WITH TIES together?
OFFSET FETCH
不支持 TOP (n) WITH TIES
选项的逻辑等效项,该选项通过返回所有关系来确保确定性。
是否有任何解决方法可以将 OFFSET FETCH
和 WITH TIES
放在一起?
使用示例数据创建语句
CREATE TABLE #tbl(Id INT, Name VARCHAR(10))
INSERT #tbl
SELECT 1, 'a' UNION ALL
SELECT 1, 'a' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 3, 'c' UNION ALL
SELECT 3, 'c' UNION ALL
SELECT 3, 'c'
顶部
SELECT TOP 3 * FROM #tbl ORDER BY Id
Id Name
1 a
1 a
2 b
并列前 n 名
SELECT TOP 3 WITH TIES * FROM #tbl ORDER BY Id
Id Name
1 a
1 a
2 b
2 b
2 b
偏移获取
SELECT *
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 3 ROWS ONLY
Id Name
1 a
1 a
2 b
大概需要用到Ranking功能来实现吧??
只需将它们一起使用,无需在 CTE 中使用 FETCH 语句
;WITH cte AS
(
SELECT Id, Name
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
)
SELECT TOP 3 WITH TIES *
FROM cte
ORDER BY Id
偏移量为 3 的示例 SQLFiddle
;WITH cte AS
(
SELECT Id, Name
FROM #tbl
ORDER BY Id
OFFSET 3 ROWS
)
SELECT TOP 3 WITH TIES *
FROM cte
ORDER BY Id
SELECT *
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 3 ROWS WITH TIES
OFFSET FETCH
不支持 TOP (n) WITH TIES
选项的逻辑等效项,该选项通过返回所有关系来确保确定性。
是否有任何解决方法可以将 OFFSET FETCH
和 WITH TIES
放在一起?
使用示例数据创建语句
CREATE TABLE #tbl(Id INT, Name VARCHAR(10))
INSERT #tbl
SELECT 1, 'a' UNION ALL
SELECT 1, 'a' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 3, 'c' UNION ALL
SELECT 3, 'c' UNION ALL
SELECT 3, 'c'
顶部
SELECT TOP 3 * FROM #tbl ORDER BY Id
Id Name
1 a
1 a
2 b
并列前 n 名
SELECT TOP 3 WITH TIES * FROM #tbl ORDER BY Id
Id Name
1 a
1 a
2 b
2 b
2 b
偏移获取
SELECT *
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 3 ROWS ONLY
Id Name
1 a
1 a
2 b
大概需要用到Ranking功能来实现吧??
只需将它们一起使用,无需在 CTE 中使用 FETCH 语句
;WITH cte AS
(
SELECT Id, Name
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
)
SELECT TOP 3 WITH TIES *
FROM cte
ORDER BY Id
偏移量为 3 的示例 SQLFiddle
;WITH cte AS
(
SELECT Id, Name
FROM #tbl
ORDER BY Id
OFFSET 3 ROWS
)
SELECT TOP 3 WITH TIES *
FROM cte
ORDER BY Id
SELECT *
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 3 ROWS WITH TIES