`
JavaVsServlet
  • 浏览: 10930 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

SQL Server 2000、2005数据库表无主键、无不重复值数据列分页问题处理方法

阅读更多


1、SQL Server2000

无主键、无不重复数据列:可使用多个列值组合形成不重复数据列来模拟主键。

由于2000不支持Row_NUMBER() over(order by 列名)函数,因此不能使用该函数获取唯一编号来达到模拟主键,实现分页。

建议使用分页语句语法如下:

selecttop 每页显示行数 * from 表名A where (A列+B列+C列...) not in(select top (当前页数-1)*每页显示行数) (A列+B列+C列...) from 表名A where条件 order by 列名[desc]) where条件 order by 列名[desc]

如:select top50 * from A where (A.a1+A.a2+A.a3) not in (select top ((1-1)*50) (a1+a2+a3)from A where a4 like '%张%' order by a4 desc) where a4 like '%张%' order by A.a4 desc

其中:①、A列、B列、C列为可组成不重复值组合,A列+B列+C列值为NULL时,表示A、B、C三列中有一列值为NULL,导致最终合并结果为NULL,可使用isNull函数来判断,语法为:isNull(列名,默认值),表示如果列值为空,则赋予默认值。如:(isNull(A列,'A')+isNull(B列,'B')+isNull(C列,'C')),
      ②、desc可选,加上则表示按照order by 列名降序排列。
      ③、子查询里面和外面都加where条件是为了更准确查询出记录,外面不加where条件,则查询出内容不满足条件值约束。



2、SQL Server2005

无主键、无不重复数据列:

①、可采用SQL Server 2000分页方法进行处理;

②、使用Row_NUMBER() over(order by 列名)函数,模拟主键,来实现分页,ROW_NUMBER() over(order by 列名)函数会生成从1开始的自然数。语法如下:

select * from (selectROW_NUMBER() over(order by A列[desc] as rowNumber, * from 表名 Awhere 条件) new_A where rowNumber between 每页显示行数*(当前页-1)+1 and 每页显示行数*当前页

如:select *from (select ROW_NUMBER() over(order by A.a desc) as rowNumber,* from A where 1= 1 ) new_A where rowNumber between 100*(1-1)+1 and 100*1

其中:desc可选,加上则表示按照order by 列名降序排列。



希望该思路和解决方法,能给遇到同样棘手问题的同仁提供参考和帮助。

弱弱的说一句:没有主键的表不能称之为表。—引用论坛大神***回复。

At the last,please设计数据库及表结构的大神,在设计时加上主键,以避免其他不必要的数据操作和维护方面的麻烦事情发生。





2
10
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics