吐槽一下,在这边公司写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;