sql server 查询表A中第51条到第60条记录

 

SQL 语句中, asc是指定列按升序排列,desc则是指定列按降序排列。

排序子句语法:order by 列名 asc/desc

 

1.取出表A中的第51条到第60条记录。表A以自动增长的ID作为主键。

 1、假设ID是连续的:

    select top 10 * from A where ID not in (select top 50 ID from A)

  或

    select  *  from A where ID between 51 and 60

2.取出表A中的第51条到第60条记录。表A以自动增长的ID作为主键。(注意:ID可能不是连续的)

第一种:

SELECT TOP 10 * FROM T_ProjectHisDoc WHERE Phd_Id NOT IN (SELECT TOP 51 Phd_Id FROM T_ProjectHisDoc )

==》select top 10 * from tableA where ID not in (select top 51 ID from tableA)

第二种

select top 60 * from T_ProjectHisDoc except select top 50 * from T_ProjectHisDoc

错误的提示:数据类型 text 不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不可比较。 Severity 16

==》select top 60 * from tableA  except select top 50 * from tableA    

换成语句: select top 60 * from T_User except select top 50 * from T_User 没有报错

错误原因:

EXCEPT 返回两个结果集的差(即从左查询中返回右查询没有找到的所有非重复值)。

 因为查询的表,报错因为限制条件3导致的。

语法:

{ (<SQL-查询语句1>) } 
{ EXCEPT | INTERSECT } 
{ (<SQL-查询语句2> )}

限制条件

    • (1)所有查询中的列数和列的顺序必须相同。
    • (2)比较的两个查询结果集中的列数据类型可以不同但必须兼容。
    • (3)比较的两个查询结果集中不能包含不可比较的数据类型(xml、text、ntext、image 或非二进制 CLR 用户定义类型)的列。
    • (4)返回的结果集的列名与操作数左侧的查询返回的列名相同。ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名。
    • (5)不能与 COMPUTE 和 COMPUTE BY 子句一起使用。
    • (6)通过比较行来确定非重复值时,两个 NULL 值被视为相等。(EXCEPT 或 INTERSECT 返回的结果集中的任何列的为空性与操作数左侧的查询返回的对应列的为空性相同。)

 

以上两种解法相对比较简单,并且不要求ID是否连续或者自动增长。不过这两种解法适合于SQL SERVER,并不适合于ORCLE数据库。

 

第三种解法:

       select * from (select ROW_NUMBER() over(order by t.ID) curr,t.* from tableA t) a where a.curr between 51 and 60

  这种解法使用到了row_number() over函数,此函数返回一个列。这种写法倒是能够同时适用于SQL SERVER和ORCLE数据库,不过需要ID是自增长的。

第三种解法查询原文链接:https://blog.csdn.net/u010104750/article/details/51030642 

posted @ 2019-03-27 10:14  suqq小白  阅读(938)  评论(0编辑  收藏  举报