IBM DB2 SQL去重和分页的写法

吐槽一下,在这边公司写sql时,发现某张表(账户表)居然没有主键,这是我这么多年见过的第一张没有主键的表!!!具体的代码未看过,不知道有没有在逻辑层进行数据唯一性校验。

分页SQL

DB2的分页同Oracle类似,都是通过rowid进行分页,如下:

-- 从第一条查到第一千条
select * from (
    select 字段列表,
           rownumber() over (order by 排序字段1, 排序字段2 ) as orowid
    from 表名
) as o where o.orowid >= 1 and o.orowid <= 1000;

去重SQL

对于完全重复的记录,去重比较简单,直接使用distinct关键字即可:

select distinct 字段1,字段2,字段3 from  表名

除此之外,还可以使用group by:

select 字段1,字段2,字段3 from  表名 group by 字段1,字段2,字段3

如果不完全重复,则比较麻烦,比如如下数据:

李四  广东  23
张三  江苏  13
张三  江苏  29

我想找到每个不同地区的不同姓名,此时distinct和group by就不合适了,可以使用如下方式:

select 姓名,地区,年龄
from
(
    select
          字段1, 字段2, 字段3
         ,row_number()over(partition by 姓名,地区 order by 地区) as row
   from
         table1
)
where row=1

分页+去重

分页SQL和去重SQL如果要同时使用,则要写双重子查询:

select * from (
    select i.*,
           rownumber() over (order by 字段列表 ) as orowid
    from (
        select 字段列表
               rownumber() over (partition by 去重分组字段列表 order by 排序字段列表 ) as rowid
        from 表名
    ) as i where rowid = 1
) as o where o.orowid >= 1 and o.orowid <= 1000;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值