0

C_PROV_TYPE ='014' および C_SPECILTY = '300' のすべての行をコピーして挿入する必要があります

以下のように、出力の下に表示される 2 つの有効な行のそれぞれに 3 つの行が必要です。

主キーは C_PROCEDURE + C_PROV_TYPE + SPEC_SEQ_NO! 出力はbLOWのようになりますここに画像の説明を入力

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 行のテーブル (返されたすべての行の 3 つのコピーを生成する) にクロス結合され、指定されたC_PROV_TYPEおよびの値によってフィルター処理されますC_SPECIALTY

新しいデータ行は、サブクエリから直接C_PROCEDUREプルされます。サブクエリの値とインライン テーブルの値を使用して、C_PROV_TYPE新しいC_SPECIALTY値が生成されます。rn新しいシーケンス番号は、ROW_NUMBER()関数とサブクエリによって返される最大シーケンス番号を使用して生成されます。

DB2 の稼働中のインストールにアクセスできなかったので、SQL Server 2008 でスクリプトをテストし、SQL Server と同様に DB2 がサポートしていることを理解している機能に固執しようとしました。この SQL Fiddle デモでも、SQL Server 2008 インスタンスを使用してクエリの動作を示します。

于 2012-10-08T05:44:41.723 に答える