【问题标题】:How to get only second,third,fourth or fifth row of a query result?(SQL SERVER 2000)如何只获取查询结果的第二、第三、第四或第五行?(SQL SERVER 2000)
【发布时间】:2009-02-11 21:05:10
【问题描述】:

我需要一个建议,甚至是一个解决方案,如何只获得查询结果的第二行、第三行……高性能。我知道可能有 row_number(SQL Server 2005 或更高版本),但不适用于 SQL Server 2000 :-(

我第一次尝试获得第五行是:
选择前 1 列
来自(选择前 5 列
来自表
ORDER BY col) q
按列 DESC 排序

我尝试解释我的要求:在我的表中可以有最大值。一人5排。但是,如果这个人只存在 4 行,我的上述查询会得到错误的结果。

有什么建议吗?

任何帮助将不胜感激!

谢谢转发,最好的问候安德烈亚斯

【问题讨论】:

    标签: sql-server-2000


    【解决方案1】:

    可能最好和最快的方法是在数据读取器中选择前 5 个,然后根据需要将下一个读入内存。

    【讨论】:

      【解决方案2】:

      要获得第 5 行,您可以使用多个子查询,例如:

      select top 1 MyCol from MyTable
      where MyCol = 
      (
          select top 1 MyCol from 
          (
              select top 5 MyCol from MyTable order by MyCol
          ) t order by MyCol desc
      )
      

      【讨论】:

        【解决方案3】:

        应该这样做...

        CREATE PROCEDURE [dbo].[sp_UpdateSkills]
        AS
        BEGIN
            set nocount on
        
            declare @UserID int
            declare @Skill varchar(1)
            declare @SkillCount int
        
            declare @Skill1 varchar(1)
            declare @Skill2 varchar(1)
            declare @Skill3 varchar(1)
            declare @Skill4 varchar(1)
            declare @Skill5 varchar(1)
        
            declare csrUser cursor for
                select distinct UserID
                from dbo.tblSkills1
                order by 1
        
            open csrUser
        
            fetch next from csrUser into @UserID
            while (@@fetch_status = 0)
            begin
                declare csrSkill cursor for
                    select Skill
                    from dbo.tblSkills1
                    where UserID = @UserID
                    order by Skill
        
                set @SkillCount = 1
                set @Skill1 = null
                set @Skill2 = null
                set @Skill3 = null
                set @Skill4 = null
                set @Skill5 = null
        
                open csrSkill
        
                fetch next from csrSkill into @Skill
                while (@@fetch_status = 0 and @SkillCount < 6)
                begin
                    print @UserID
                    print @Skill
        
                    if (@SkillCount = 1)
                        set @Skill1 = @Skill
                    else if (@SkillCount = 2)
                        set @Skill2 = @Skill
                    else if (@SkillCount = 3)
                        set @Skill3 = @Skill
                    else if (@SkillCount = 4)
                        set @Skill4 = @Skill
                    else if (@SkillCount = 5)
                        set @Skill5 = @Skill
        
                    set @SkillCount = @SkillCount + 1
        
                    fetch next from csrSkill into @Skill
                end
        
                close csrSkill
                deallocate csrSkill
        
                insert into tblSkills2
                (UserID, Skill1, Skill2, Skill3, Skill4, Skill5)
                values
                (@UserID, @Skill1, @Skill2, @Skill3, @Skill4, @Skill5)
        
                fetch next from csrUser into @UserID
            end
        
            close csrUser
            deallocate csrUser
        END
        

        【讨论】:

        • 非常感谢。你是我的英雄 ;-)
        【解决方案4】:

        如果我理解正确,例如,如果实际上有第 5 行,您只希望返回该行。在这种情况下,您可以这样做:

        SELECT TOP 1 col
        FROM (
            SELECT TOP 5 col
            FROM table
            where (SELECT COUNT(*) FROM table) >= 5
            ORDER BY col
        ) q
        ORDER BY col DESC
        

        【讨论】:

          【解决方案5】:

          这是另一个例子。这个使用带有标识列的临时表。

          SELECT TOP 5 IDENTITY(int) as id, col
            INTO #t
            FROM table
           ORDER BY col
          
          SELECT col FROM #t WHERE id = 5
          
          DROP TABLE #t
          

          【讨论】:

            猜你喜欢
            • 2014-07-23
            • 2015-03-16
            • 1970-01-01
            • 2015-06-02
            • 1970-01-01
            • 1970-01-01
            • 2014-12-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多