0

需要复制并插入 C_PROV_TYPE ='014' 和 C_SPECILTY ='300' 的所有行

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

主键是 C_PROCEDURE + C_PROV_TYPE + SPEC_SEQ_NO!输出应如下所示在此处输入图像描述

4

1 回答 1

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提供最大值的所有行。I_PT_SPEC_SEQ_NO(C_PROCEDURE, C_PROV_TYPE)MAX()MAX(...) OVER (...)

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

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

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

于 2012-10-08T05:44:41.723 回答