如何顺序更新丢失的记录

问题描述

我的序列中有丢失的记录,而我当前的输出看起来像这样

|       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;