Db2 需要复制C#u PROV#u TYPE=';014和x27;C#u SPECILTY=&x27;300';并向后插入具有相同数据的3行+;最大序列号+;1即=4,5,6
下面显示的两个有效行中的每一行需要3行,如下所示: 主键是C_程序+C_认证类型+规范序号! 输出应如下所示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
您可以尝试以下方法:
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'
;
基本上,子查询使用windowingMAX()
函数(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,因此将插入第三行