首页 > 数据库技术 > 详细

sql查询前后两位

时间:2014-02-28 10:31:04      阅读:610      评论:0      收藏:0      [点我收藏+]

 

SQL排名的问题,A这个人在数据库里排第十,怎么查询一个他前面两位,后面两位,包括自己的五条数据,各位有啥高招?

bubuko.com,布布扣
DECLARE @table TABLE
    (
      id INT PRIMARY KEY
             IDENTITY(1, 1) ,
      NAME VARCHAR(20)
    )
INSERT  INTO @table( NAME )VALUES  ( AA )
INSERT  INTO @table( NAME )VALUES  ( BB )
INSERT  INTO @table( NAME )VALUES  ( CC )
INSERT  INTO @table( NAME )VALUES  ( DD )
INSERT  INTO @table( NAME )VALUES  ( EE )
INSERT  INTO @table( NAME )VALUES  ( FF )
INSERT  INTO @table( NAME )VALUES  ( GG )
INSERT  INTO @table( NAME )VALUES  ( HH )
INSERT  INTO @table( NAME )VALUES  ( II )
INSERT  INTO @table( NAME )VALUES  ( JJ )
bubuko.com,布布扣


方法: 1 .添加一个列,排序,记录中间需要的 mun 数,之后利用 between and 查询

bubuko.com,布布扣
DECLARE @min INT ,
@max INT

SELECT  @min = v.mun - 2 ,
        @max = v.mun + 2
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id,NAME
          FROM      @table
        ) v
WHERE   v.NAME = ee

SELECT  w.id ,
        w.NAME
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id,name
          FROM      @table
        ) w
WHERE   w.mun BETWEEN @min AND @max
bubuko.com,布布扣

 

方法2. 利用链表查询,将一个分成两个集合,利用on 做条件 ON t1.mun BETWEEN t2.mun - 2 AND t2.mun + 2

bubuko.com,布布扣
SELECT  t1.id ,
        t1.NAME
FROM    ( SELECT ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id ,NAME
          FROM      @table
        ) T1
        RIGHT JOIN 
        ( SELECT ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id ,NAME
                     FROM   @table
        ) T2 ON t1.mun BETWEEN t2.mun - 2 AND t2.mun + 2
WHERE   T2.NAME = EE
bubuko.com,布布扣

 

方法3. 利用EXISTS

例子

bubuko.com,布布扣
SELECT  *
FROM    @table T1
WHERE   EXISTS 
        ( SELECT *
                 FROM   @table T2
                 WHERE  T2.NAME = EE
                        AND T1.id BETWEEN T2.id - 2 AND T2.id + 2 )
bubuko.com,布布扣

完善

bubuko.com,布布扣
SELECT  T1.id ,T1.name
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id ,NAME
          FROM      @table
        ) T1
WHERE   EXISTS 
        ( SELECT mun ,id ,NAME
                 FROM   ( SELECT    ROW_NUMBER() OVER ( ORDER BY id ASC ) AS mun ,id ,NAME
                          FROM      @table
                        ) T2
                 WHERE  T2.NAME = EE
                        AND T1.mun BETWEEN T2.mun - 2 AND T2.mun + 2 
        )
bubuko.com,布布扣

 

张姿势了~_~!

sql查询前后两位,布布扣,bubuko.com

sql查询前后两位

原文:http://www.cnblogs.com/Jolinson/p/3517766.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!