2017-04-12 51 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