如何顺序更新丢失的记录

时间:2020-10-10 11:17:01

标签: sql sql-insert recursive-query 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 |
                         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 |

2 个答案:

答案 0 :(得分:0)

如果您事先知道丢失的id的范围,则可以使用generate_series()。假设您的表名为mytable并且具有列(id, col1, col2, col3, col4, col5),则您可以复制具有id 1882的记录以用以下查询填充空白:

insert into mytable (id, co11, col2, col3, col4, col5)
select value, col1, col2, col3, col4, col5
from sys.generate_series(1883, 2121, 1)
cross join mytable t
where t.id = 1882

答案 1 :(得分:0)

假设表的架构类似于:

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, 2121, 1),
    (select distinct col1 from mytable where id = 1883) as tmp;

但是,新记录将追加到现有记录中,因此,如果您希望按照上面显示的顺序退回它们,则需要通过以下方式附加订单:

select * from mytable order by id, col1;
相关问题