Db2 需要复制C#u PROV#u TYPE=';014和x27;C#u SPECILTY=&x27;300';并向后插入具有相同数据的3行+;最大序列号+;1即=4,5,6

Db2 需要复制C#u PROV#u TYPE=';014和x27;C#u SPECILTY=&x27;300';并向后插入具有相同数据的3行+;最大序列号+;1即=4,5,6,db2,Db2,下面显示的两个有效行中的每一行需要3行,如下所示: 主键是C_程序+C_认证类型+规范序号! 输出应如下所示 您可以尝试以下方法: INSERT INTO YourTable ( C_PROCEDURE, C_PROV_TYPE, I_PT_SPEC_SEQ_NO, C_SPECIALTY ) SELECT s.C_PROCEDURE, s.C_PROV_TYPE, s.MaxSeq + ROW_NUMBER() OVER ( PARTITION BY s.C

下面显示的两个有效行中的每一行需要3行,如下所示:

主键是C_程序+C_认证类型+规范序号! 输出应如下所示


您可以尝试以下方法:

INSERT INTO YourTable (
  C_PROCEDURE,
  C_PROV_TYPE,
  I_PT_SPEC_SEQ_NO,
  C_SPECIALTY
)
SELECT
  s.C_PROCEDURE,
  s.C_PROV_TYPE,
  s.MaxSeq + ROW_NUMBER() OVER (
    PARTITION BY s.C_PROCEDURE, s.C_PROV_TYPE
    ORDER BY v.rn, s.I_PT_SPEC_SEQ_NO),
  s.C_SPECIALTY + v.rn
FROM (
  SELECT
    *,
    MAX(I_PT_SPEC_SEQ_NO) OVER (
      PARTITION BY C_PROCEDURE, C_PROV_TYPE
    ) AS MaxSeq
  FROM YourTable
) s
CROSS JOIN (
  VALUES (1), (2), (3)
) v (rn)
WHERE s.C_PROV_TYPE = '014'
  AND s.C_SPECIALTY = '300'
;
基本上,子查询使用windowing
MAX()
函数(
MAX(…)OVER(…)
)返回所有
YourTable
行,每个
(C\u过程,C\u PROV\u类型)
分区的最大值为
I\u PT\u SPEC\u SEQ\u NO

然后,该子查询的结果集交叉连接到一个内联3行表(该表生成返回的每一行的三个副本),并按
C\u PROV\u TYPE
C\u speciality
的指定值进行过滤

新数据行直接从子查询中提取
C_过程
C_PROV_类型
。新的
C_speciality
值是使用来自子查询的值和内联表的
rn
值生成的。新序列号是在
ROW_NUMBER()
函数和子查询返回的最大序列号的帮助下生成的


由于我无法访问运行中的DB2安装,所以我在SQLServer2008中测试了我的脚本,试图坚持使用我理解的DB2支持的特性以及SQLServer支持的特性。还使用SQL Server 2008实例演示查询的工作方式。

新的C_专业值是否取决于源行的C_专业值?也就是说,如果是400,新行是否需要相应地分配401402403的C_专业?另外,C_Speciality真的是一个数字列吗?是的,只有C_Speciality=300的行才应该被获取..对于输出,最大序号应该是C_Speciality=300的C_过程的max(序号)+1示例:在上面的输入图片中。。如果我们还有一行C_过程=S9480,规格=000,但序列号=7,那么我们不必提取该行,但C_过程S9480的输出行序列号应从8get maxsequence number开始,对于任何规格的C_过程,现在只选择规格=300的行,然后为该行创建三个新行,该行获取的最大序列号为+1,sepcilty=301,最大序列号为+2,specilty=302,因此将插入第三行