select top 10 * from vendor where id not in (select top 20 * id from vendor order by id) order by id
上面这句是查询表的第三页,每页10条记录。但是用嵌套查询的效率很低,这点在数据多的时候可以证实。
还有一种分页方法是获取要查询页面的最大id和最小id,然后取中间的记录。
现在我不想用以上两种方法,将上面的嵌套查询语句改成等价的连接语句之后效率也会明显提高,但我忘了应该怎么改,希望高手解答。

解决方案 »

  1.   

    你可以先放到一个临时表中select id=identity(int,1,1),* into # from tb然后select * from # where id between 20 and 30
      

  2.   

    --方法1:
    --适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id NOT IN
              (
              SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
              )
    ORDER BY id
    --方法2:
    --适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id >
              (
              SELECT ISNULL(MAX(id),0) 
              FROM 
                    (
                    SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
                    ) A
              )
    ORDER BY id
    --方法3:
    --适用于 SQL Server 2005
    SELECT TOP 页大小 * 
    FROM 
            (
            SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
            ) A
    WHERE RowNumber > 页大小*(页数-1)
    --方法四 适用于 SQL Server 2005
    DECLARE @pagenum AS INT, @pagesize AS INT 
    SET @pagenum = 2 
    SET @pagesize = 3 
    SELECT * 
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum, 
            newsid, topic, ntime, hits 
          FROM news) AS D 
    WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize 
    ORDER BY newsid DESC
    说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。
      

  3.   

    楼上两位可能没有看清我的问题,要将以上语句改成等价的连接语句,你写的语句至少要包含join关键字吧.