【问题标题】:Get data from SQLServer in ASC order按 ASC 顺序从 SQLServer 获取数据
【发布时间】:2017-04-12 15:46:30
【问题描述】:

我有一个列名 id 和 value 的表。在将数据保存在 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

我试过查询

Group 1:select top(11) * from tblCode order by id ASC

第 2 组:SELECT top(22)* FROM tblCode 除了 select top(11) * from tblCode order by id ASC

第 3 组:SELECT top(33)* FROM tblCode 除了 select top(22) * from tblQRCode order by id ASC

组 4:SELECT top(44)* FROM tblCode 除了 select top(33) * from tblCode order by id ASC

我的问题是因为数据在保存到数据库时是随机排序的,所以它们是随机检索的。

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

帮我选择上述组的数据。

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?
  • 如果可能的话最好插入一列'grp'并在那里放一个组名,然后检索它。
  • @Damien_The_Unbeliever 这是 SQL Server 2012

标签: c# sql-server visual-studio


【解决方案1】:

使用OFFSET and FETCH 而不是TOP

例如第二组是:

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

【讨论】:

  • @Sdp - 我添加了一个完整的重现脚本,表明它可以正常工作。如果它对您不起作用,那么您提出的问题或您如何将我的答案翻译回您的数据中都缺少一些东西。鉴于您提供的当前详细程度,我无能为力。
  • 是的,我的数据库不知何故被清除了。谢谢你,我欠你一杯啤酒:)..
【解决方案2】:

这也可以获得您想要的结果。对于其他查询,将 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

【讨论】:

    【解决方案3】:

    试试这个,

    select * from Table Name Order by ID
    

    【讨论】:

      【解决方案4】:

      希望我没有误会:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        • 1970-01-01
        • 1970-01-01
        • 2020-02-16
        • 1970-01-01
        相关资源
        最近更新 更多