我有一个包含列名id和值的表。当数据保存在sql server数据库中时,它按随机顺序排序,即id值1,2,3,4,5,6,7,14,15,16,17,8,9,10等。
我需要检索4组中的数据,每组包含11个asc id顺序的数据,
即
第1组:1-11 第2组:12-22 第3组:23-33 第4组:33-44
我尝试了查询
组1:通过id ASC从tblCode顺序中选择top(11)*
第2组:SELECT top(22)* FROM tblCode除了从id ASC的tblCode顺序中选择top(11)*
组3:SELECT top(33)* FROM tblCode,除了从id ASC的tblQRCode顺序中选择top(22)*
第4组:SELECT top(44)* FROM tblCode,除了从id ASC的tblCode顺序中选择top(33)*
我的问题是什么,因为数据是在将数据保存到数据库中时随机排序的,它们是随机检索的。
以下是我的数据如何保存在数据库中的屏幕截图。
答案 0 :(得分:4)
使用OFFSET
and FETCH
而不是TOP
。
E.g。第二组是:
select *
from tblCode
order by id ASC
offset 11 rows
fetch next 11 rows only
完整的repro脚本:
declare @t table (ID int not null, Value varchar(93) not null);
;With Numbers as (
select ROW_NUMBER() OVER (ORDER BY so1.object_id) as n
from sys.objects so1,sys.objects so2,sys.objects so3
)
insert into @t (ID,Value)
select n,'PEC-' + CONVERT(varchar(93),n)
from Numbers
where n between 1 and 1000
select *
from @t
order by id ASC
offset 11 rows
fetch next 11 rows only
结果:
ID Value
----------- ---------
12 PEC-12
13 PEC-13
14 PEC-14
15 PEC-15
16 PEC-16
17 PEC-17
18 PEC-18
19 PEC-19
20 PEC-20
21 PEC-21
22 PEC-22
答案 1 :(得分:0)
这也可以得到您想要的结果。对于其他查询,使用其他值更改33,现在它从33到22获取值。
WITH t AS
( SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_num, *
FROM tblCode )
SELECT TOP 11 *
FROM t
WHERE row_num > 33
答案 2 :(得分:0)
试试这个,
select * from Table Name Order by ID
答案 3 :(得分:0)
我希望我不会误解:
--Group 1
SELECT *
FROM tblCode
WHERE id >= 1
AND id <= 11
ORDER BY id ASC
--Group 2
SELECT *
FROM tblCode
WHERE id >= 12
AND id <= 22
ORDER BY id ASC
--Group 3
SELECT *
FROM tblCode
WHERE id >= 23
AND id <= 33
ORDER BY id ASC
您还可以将增量保存在变量中。也许这样的事情(即)你发送param group no 3:
--Group 3
SELECT @Group = 3 --just for sample, param should sent From application
SELECT @lastIndex = 3*11
SELECT @indexStart = @lastIndex - 10
SELECT *
FROM tblCode
WHERE id >= @indexStart
AND id <= @lastIndex
ORDER BY id ASC