2017-04-12 53 views
3

我有一个列名称为id和值的表。在sql server数据库中保存数据时,它会按随机顺序排序,即id值1,2,3,4,5,6,7,14,15,16,17,8,9,10等。以ASC顺序从SQLServer获取数据

我需要与ASC ID顺序各具有11个数据检索4组数据,

即,

组1:1-11 第2组:12-22 第3组: 23-33 第4组:33-44

我曾尝试查询

组1:选择顶部(11)*从tblCode顺序按id ASC

组2:SELECT顶部(22)* FROM tblCode除了按id ASC

组3中选择顶部(11)*从tblCode顺序:SELECT顶部* FROM tblCode除了选择顶部(22)*由tblQRCode(33) ORDER BY ID ASC

组4:选择顶(44)* FROM tblCode除了通过ID ASC选择顶(33)*从tblCode为了

我的问题是什么,因为数据是随机排序,同时将这些数据保存到数据库,他们随机检索。

下面是我的数据如何保存在数据库中的屏幕截图。

Screenshot 帮助我选择上述组的数据。

+0

你正在使用什么版本的SQL Server? –

+0

如果可能,最好插入一列'grp'并在其中放置一个组名,然后检索它。 –

+0

@Damien_The_Unbeliever它是SQL Server 2012 – Sdp

回答

4

使用OFFSET and FETCH而不是TOP

E.g.两组是:

select * 
from tblCode 
order by id ASC 
offset 11 rows 
fetch next 11 rows only 

完成摄制脚本:

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 
+0

@Sdp - 我已经添加了一个完整的repro脚本来显示它的工作。如果它不适合你,那么在你提出的问题中,或者你已经将我的答案转换回数据中,都会有缺失。鉴于您提供的当前详细程度,我无法做更多。 –

+0

是的,我的数据库不知何故被清除。 谢谢,我欠你一杯啤酒:) – Sdp

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 
0

试试这个,

select * from Table Name Order by ID 
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 

你也可以将增量保存在变量中。也许像这样(即)你发送参数组号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