postgresql:如何为某个数字复制行?

9jyewag0  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(369)

我有一张这样的样品台

col1    col2    col3    num1    num2
------------------------------------
val1    val2    val3     1       5
val4    val5    val6     7       15
val7    val8    val9     18      26

我想让行变成num2和num1之间的差。例如,我希望第一行是4行(5-1=4)。
预期结果:

col1    col2    col3    num1    num2
------------------------------------
val1    val2    val3     1       5
val1    val2    val3     1       5
val1    val2    val3     1       5
val1    val2    val3     1       5
val4    val5    val6     7       15
val4    val5    val6     7       15
val4    val5    val6     7       15
val4    val5    val6     7       15
val4    val5    val6     7       15
val4    val5    val6     7       15
val4    val5    val6     7       15
val4    val5    val6     7       15
val7    val8    val9     18      22
val7    val8    val9     18      22
val7    val8    val9     18      22
val7    val8    val9     18      22

这里的答案是postgresql:如何复制一行,没有主键可以复制吗?还是绝对需要pk?那么实现这一目标最有效的方法是什么?我正在考虑使用for循环作为通用编程,但我相信使用sql有一种更简单的方法

o8x7eapl

o8x7eapl1#

您可以使用generate\ u series()来:

select t.*
from the_table t
  cross join generate_series(t, d.num2 - t.num1)

在线示例
如果要将这些行插入表中,请在 INSERT 在它前面:

insert into the_table(col1, col2, col3, num1, num2)
select t.*
from the_table t
  cross join generate_series(1, t.num2 - t.num1)

在线示例
包含负差(num2<num1)并删除不必要的原始行

insert into the_table(col1, col2, col3, num1, num2)
select t.*
from the_table t
  cross join generate_series(1, abs(t.num2 - t.num1) - 1)
im9ewurl

im9ewurl2#

可以使用递归cte生成重复行,然后使用 INSERT...SELECT 查询以插入它们:

WITH RECURSIVE CTE AS (
  SELECT col1, col2, col3, num1, num2, num1 + 1 AS cnt
  FROM data
  UNION ALL
  SELECT col1, col2, col3, num1, num2, cnt + 1
  FROM CTE
  WHERE cnt < num2 - 1
)
INSERT INTO data
SELECT col1, col2, col3, num1, num2
FROM CTE
;
SELECT *
FROM data
ORDER BY col1

输出

col1    col2    col3    num1    num2
val1    val2    val3    1       5
val1    val2    val3    1       5
val1    val2    val3    1       5
val1    val2    val3    1       5
val4    val5    val6    7       15
val4    val5    val6    7       15
val4    val5    val6    7       15
val4    val5    val6    7       15
val4    val5    val6    7       15
val4    val5    val6    7       15
val4    val5    val6    7       15
val4    val5    val6    7       15
val7    val8    val9    18      22
val7    val8    val9    18      22
val7    val8    val9    18      22
val7    val8    val9    18      22

sqlfiddle演示

相关问题