我公司的客户有一个表来存储库存数据,这个库存使用一个名为product_code的列来分隔产品,它还有另一个名为Qtd的列来存储有多少相同的产品库存。我需要帮助的是,我需要将这一行产品分成 n 个不同的行,其中 n 是存储在 Qtd 中的值。示例:
原文:
行 | 产品代码 | Qtd |
---|---|---|
1 | 111 | 15 |
新:
行 | 产品代码 | Qtd |
---|---|---|
1 | 111 | 1 |
2 | 111 | 1 |
3 | 111 | 1 |
... | ... | ... |
14 | 111 | 1 |
15 | 111 | 1 |
我需要创建这个新行,因为他们试图引入一个代表产品序列号的新列,该列是唯一的,并且我无法使用联接,因为该序列号存储在不同的数据库中。我们有一种方法可以根据产品代码为产品分配序列号,但只有第一个序列号能够正确配对,如果可能的话,将这一行分成不同的行将以实用的方式解决这个特定问题当然。
我们尝试使用我们的软件执行此操作,但最终仅将第一个序列号分配给一行,而所有其他序列号均未使用。我们希望这次尝试能够将数据分成不同的行。
理想情况下,您在整个桌子上执行此操作,而没有其他任何东西改变它。 如果需要支持并发活动,那就复杂很多了。
首先准备创建一个新表来获取新行:
create table new_inventory like inventory;
rename table inventory to old_inventory, new_inventory to inventory;
然后使用递归 cte 插入分割行来生成它们:
insert into inventory (product_code, Qtd)
with recursive generate_rows as (
select product_code, Qtd from old_inventory
union all
select product_code, Qtd-1 from generate_rows where Qtd > 1
)
select product_code, 1 Qtd from generate_rows;