簡単な質問は、PKを使用してレコードのセットを取得し、複製のキーをわずかに変更して、ソースごとに正確に2つのレコードを作成するにはどうすればよいかということです。つまり、4000レコードを取得し、4000が同一で、他の4000のキーがわずかに変更された8000レコードを生成します。これは本質的に2つの選択(長い話)であるため、私は結合を行うことができません。
残りは複雑になりますが、例を提供するために必要かもしれません。
これは私のオリジナルセットです(4000以上のレコードが含まれています)
dateGroup areaGroup itemID editionID
1 1 1 1
1 1 1 2
1 2 1 1
1 2 2 1
2 1 1 1
2 1 1 2
2 2 1 1
2 2 1 2
レコードごとに、areaGroupsを「0」の下にまとめた複製レコードを作成してから、元のareaGroupsのコンマ区切りリストを個別のフィールドとして作成する必要があります。(「なぜ」は、約15年前に間違えた愚かなプログラマーです。)必要に応じてeditionIDの番号を付け直すことはできますが、元のレコードと複製レコードは同じeditionIDである必要があります(したがって、ユニオンが機能しない理由) 。PKは上記と同じままです(すべてのフィールド)
dateGroup areaGroup itemID editionID aGroups
1 0 1 1 1
1 0 1 2 1
1 0 1 1 2 // Duplicate (EditionID)
1 0 2 1 2
2 0 1 1 1
2 0 1 2 1
2 0 1 1 2 // Duplicate (EditionID)
2 0 1 2 2
最終結果は、レコードを一意にするために必要に応じてeditionIDの番号を付け直します。
dateGroup areaGroup itemID editionID aGroups (EditionID is what is altered)
1 0 1 1 1
1 0 1 2 1
1 0 1 2 2 1 changed to 2 (one more than row 1)
1 0 2 1 2
2 0 1 1 1
2 0 1 2 1
2 0 1 2 2 1 changed to 2 (one more than row 1)
2 0 1 2 2
1 1 1 1
1 1 1 2
1 2 1 2 1 changed to 2 (editionID) to match
1 2 2 1
2 1 1 1
2 1 1 2
2 2 1 2 1 changed to 2 to match above
2 2 1 2
次のように行ランクのようにeditionIDを計算できることはわかっています。
select row_number() over (
partition by dateGroup, itemID
order by dateGroup, itemID) as editionID
したがって、必要なのは、単一のセットからレコードを複製する方法を知ることだけです。