sql*_*ser 6 sql t-sql sql-server sql-order-by sql-server-2012
OFFSET FETCH
不支持与TOP (n) WITH TIES
option的逻辑等价,它通过返回所有关系来确保确定性。
有任何解决方法有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'
Run Code Online (Sandbox Code Playgroud)
最佳
SELECT TOP 3 * FROM #tbl ORDER BY Id
Id Name
1 a
1 a
2 b
Run Code Online (Sandbox Code Playgroud)
有关系的前 n 名
SELECT TOP 3 WITH TIES * FROM #tbl ORDER BY Id
Id Name
1 a
1 a
2 b
2 b
2 b
Run Code Online (Sandbox Code Playgroud)
偏移获取
SELECT *
FROM #tbl
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 3 ROWS ONLY
Id Name
1 a
1 a
2 b
Run Code Online (Sandbox Code Playgroud)
大概我们需要使用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
Run Code Online (Sandbox Code Playgroud)
;WITH cte AS
(
SELECT Id, Name
FROM #tbl
ORDER BY Id
OFFSET 3 ROWS
)
SELECT TOP 3 WITH TIES *
FROM cte
ORDER BY Id
Run Code Online (Sandbox Code Playgroud)