需要复制C_PROV_TYPE ='014'和C_SPECILTY ='300'的所有行并插回3行相同的数据+最大序列号+ 1即= 4,5,6

时间:2012-10-07 21:53:59

标签: db2

need to copy and insert back all rows with C_PROV_TYPE ='014' and C_SPECILTY = '300'

  

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

     

主键是C_PROCEDURE + C_PROV_TYPE + SPEC_SEQ_NO!   输出应该像bELOW enter image description here

1 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

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'
;

基本上,子查询使用窗口YourTable函数({{1})返回为I_PT_SPEC_SEQ_NO的每个分区提供的最大值(C_PROCEDURE, C_PROV_TYPE)的所有MAX()行})。

然后,该子查询的结果集交叉连接到内联3行表(生成返回的每行的三个副本),并按指定的MAX(...) OVER (...)C_PROV_TYPE值进行过滤。

新数据行直接从子查询中提取C_SPECIALTYC_PROCEDURE。新的C_PROV_TYPE值使用子查询中的值和内联表的C_SPECIALTY值生成。新的序列号是在rn函数和子查询返回的最大序列号的帮助下生成的。

由于我无法访问DB2的工作安装,因此我在SQL Server 2008中测试了我的脚本,试图坚持我理解DB2支持的功能以及SQL Server。 This SQL Fiddle demo还使用SQL Server 2008实例来演示查询的工作方式。