代码之家  ›  专栏  ›  技术社区  ›  Dispersia

为SQL滚动排序顺序

  •  0
  • Dispersia  · 技术社区  · 6 年前

    假设我有一张桌子看起来像:

     Users
    ---------------------
    ID | LastName | FirstName
    
    1  | Hane     | Aaron
    
    2  | Messi    | Dennis
    
    3  | Abraham  | Dont
    
    4  | Abraham  | Carrey
    

    如果按lastname,firstname排序,那么我对行号的期望顺序是ids:4,3,1,2。

    我的问题是我选择一行,并将其返回到应用程序。然后,我希望能够根据用户id进行排序,以根据相同的顺序获取下一行。

    因此,如果我执行第一次选择,并返回id 4,我希望能够查询sql以按顺序获取下一个用户(3)。

    我尝试的sql语句是

    select TOP(1) RowNum, FirstName, LastName, ID
    from (
        select *, ROW_NUMBER() over (order by [LastName], [FirstName]) as RowNum
        from [Users]
    ) t
    where t.RowNum > (
        select ROW_NUMBER() over (order by [LastName], [FirstName]) as RowNum
        from [Users]
        where ID = 4
    )
    

    但这不仅不起作用(最后一个sql语句将始终返回1,因为我显然正在向下筛选整个查询……)它似乎多次执行相同的逻辑,如果我正确理解order by,将解析整个表,这将非常缓慢,因为数据集变得非常大。

    有没有一种方法可以有效地实现我想要做的事情?,我只想向前滚动,如果可能的话,在末尾换行(所以id 4,3,1,2,4,3,1,2等)。

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   Tab Alleman    6 年前

    使用CTE:

    WITH cte AS (
        select *, ROW_NUMBER() over (order by [LastName], [FirstName]) as RowNum
        from [Users]
    )
    SELECT TOP 1 *
    FROM cte
    WHERE RowNum > (SELECT RowNum FROM cte WHERE ID=4)
    ORDER BY RowNum ASC
    
        2
  •  1
  •   Zack    6 年前

    与其每次需要下一个用户时都调用数据库,不如调用一次数据库以获取 N 用户(根据表的大小,可以是所有用户或子集)。然后,为api提供服务的应用程序将处理循环本身,而不是一次只获取一条记录就必须对数据库进行多次调用。