问题描述
我的序列中有丢失的记录,而我当前的输出看起来像这样
| 1882 | 25548860 | 4 | 30 | null | null |
| 1882 | 25548861 | 4 | 30 | null | null |
| 1882 | 25548882 | 4 | 30 | null | null |
| 1882 | 25548883 | 4 | 30 | null | null |
| 1882 | 25548884 | 4 | 30 | null | null |
| 1882 | 25548885 | 4 | 30 | null | null |
missing records in between until 2122
| 2122 | 25548860 | 4 | 30 | null | null |
| 2122 | 25548861 | 4 | 30 | null | null |
| 2122 | 25548882 | 4 | 30 | null | null |
| 2122 | 25548883 | 4 | 30 | null | null |
| 2122 | 25548884 | 4 | 30 | null | null |
| 2122 | 25548885 | 4 | 30 | null | null |
我希望我的输出采用以下格式。给我建议一个SQL查询,该查询将在1883年到2121年之间更新monetdb中的记录。
| 1882 | 25548860 | 4 | 30 | null | null |
| 1882 | 25548861 | 4 | 30 | null | null |
| 1882 | 25548882 | 4 | 30 | null | null |
| 1882 | 25548883 | 4 | 30 | null | null |
| 1882 | 25548884 | 4 | 30 | null | null |
| 1882 | 25548885 | 4 | 30 | null | null |
| 1883 | 25548860 | 4 | 30 | null | null |
| 1883 | 25548861 | 4 | 30 | null | null |
| 1883 | 25548882 | 4 | 30 | null | null |
| 1883 | 25548883 | 4 | 30 | null | null |
| 1883 | 25548884 | 4 | 30 | null | null |
| 1883 | 25548885 | 4 | 30 | null | null |
........ ..........
........ ..........
| 2122 | 25548860 | 4 | 30 | null | null |
| 2122 | 25548861 | 4 | 30 | null | null |
| 2122 | 25548882 | 4 | 30 | null | null |
| 2122 | 25548883 | 4 | 30 | null | null |
| 2122 | 25548884 | 4 | 30 | null | null |
| 2122 | 25548885 | 4 | 30 | null | null |
解决方法
如果您事先知道丢失的id
的范围,则可以使用generate_series()
。假设您的表名为mytable
并且具有列(id,col1,col2,col3,col4,col5)
,则您可以复制具有id
1882的记录以用以下查询填充空白:
insert into mytable (id,co11,col5)
select value,col5
from sys.generate_series(1883,2121,1)
cross join mytable t
where t.id = 1882
,
假设表的架构类似于:
create table mytable(id int,col1 int,col2 int,col3 int,col4 int,col5 int);
您可以使用以下命令填写“缺少的记录”:
insert into mytable
select *,4,30,null,null
from sys.generate_series(1884,1),(select distinct col1 from mytable where id = 1883) as tmp;
但是,新记录将追加到现有记录中,因此,如果您希望按照上面显示的顺序退回它们,则需要通过以下方式附加订单:
select * from mytable order by id,col1;