SQL Server 2014的分页

时间:2016-01-18 13:15:03

标签: sql-server pagination

如果我使用这个SQL,我会得到这样的记录:

SELECT * FROM news WHERE

 ID        TITLE
----      -------
 23        title 1
 25        title 2
 31        title 3
 38        title 4
 43        title 5
....         ....
 178       title 69 
 189       title 70

如果我使用分页,我的SQL就是这样:

SELECT *,
    COUNT(*) OVER () AS Total,
    ROW_NUMBER() OVER (ORDER BY news_date DESC, news_id DESC) AS Position
FROM news
ORDER BY news_date DESC, news_id DESC 
OFFSET 5 ROW FETCH NEXT 5 ROWS ONLY;

 ID        TITLE       TOTAL      POSITION
----      -------     -------    ----------
 45        title 6      70           #6
 46        title 7      70           #7
 48        title 8      70           #8
 51        title 9      70           #9
 54        title 10     70           #10

现在,我将获得前3个和后3个值,并获得#27(例如)#27 + 3 AND#27-3,因为我的ID是“127”(#27位置) 。 我可以制作一个部分SQL:

WITH NewsSql AS (
SELECT 
    *,
    COUNT(*) OVER () AS Total,
    ROW_NUMBER() OVER (ORDER BY new_date DESC,new_id DESC) AS Position
FROM news
)SELECT * FROM NewsSql 
WHERE Position<=3 OR Position>=Total-2 OR news_id=127

 ID        TITLE       TOTAL      POSITION
----      -------     -------    ----------
 23        title 1      70           #1
 25        title 2      70           #2
 31        title 3      70           #3
 127       title 27     70           #27
 175       title 68     70           #68
 178       title 69     70           #69
 189       title 70     70           #70

如何在#24和#30之间添加位置记录?

PD:抱歉我的英文

1 个答案:

答案 0 :(得分:0)

我用这个SQL解决了这个问题:

WITH NewsSql AS (
  SELECT 
    *,
    COUNT(*) OVER () AS Total,
    ROW_NUMBER() OVER (ORDER BY news_date DESC,news_id DESC) AS Position,
    (
        SELECT Pos 
        FROM (
            SELECT 
                news_id AS NewsID,
                news_title,
                ROW_NUMBER() OVER (ORDER BY news_date DESC,news_id DESC) AS Pos
            FROM news
        ) news_pos
        WHERE news_pos.NewsID= <ID_input> 
    ) AS Actual
  FROM news
)
SELECT * FROM NewsSql 
WHERE 
    Position<=3 OR 
    Position>=Total-2 OR 
    news_id=127 OR 
    Position BETWEEN Actual-5 AND Actual+5