3

通常のソフトウェア操作で行シーケンス番号が 100 ずつ増加する既存のテーブルがあります。大規模な挿入を実行し、この増分方法を維持する必要があります。ROW_NUMBER() を使用すると思っていましたが、この方法でインクリメントできるかどうかはわかりません。

その単純なトピックについては助けていただければ幸いですが、より具体的に知りたい場合は、ライン シーケンスがプロジェクトに固有のものであり、いくつかのレコードが既にシーケンスを開始していることにも注意してください。例えば

Project  Category  Sequence
Proj1    Cat4      100
Proj1    Cat2      200
Proj2    Cat7      100
Proj2    Cat1      200
Proj3    Cat1      100

したがって、これらが既に存在し、新しいレコードを挿入する場合は、各プロジェクトで既に開始されているシーケンスを考慮する必要があります。したがって、Proj1 に行を挿入する場合、Sequence 値は 300、400、... でなければなりません。

これまでの私のコードブロックは次のとおりです。

WITH CTE (PROJECTNUM, COSTCATID, LINE) AS
(  SELECT PROJECTNUM, PACOSTCATID, ROW_NUMBER() OVER(PARTITION BY PROJECTNUM ORDER BY PACOSTCATID) 
      + (SELECT MAX(LNITMSEQ) FROM PROJECTTABLE WHERE PAPROJNUMBER = A.PROJECTNUM)
   FROM PROJECTSHORTLIST A, CATEGORYTABLE
   WHERE <stuff you don't care about>
)
INSERT INTO PROJECTTABLE
(PAPROJNUMBER, PACOSTCATID, LNITMSEQ)
SELECT PROJECTNUM, COSTCATID, LINE
FROM CTE;

これにより、1 ずつ増加するレコードが生成され、Proj1 の場合は 301、302 になることがわかります。

あなたの脳力は大歓迎です。

更新: この 100 ずつのインクリメントが、行が最初に挿入された後の update ステートメントでより簡単に実行できる場合、それは完全に受け入れられることを追加します。ありがとうございました。

4

2 に答える 2

1

あなたのニーズを正しく理解していれば、これが最も単純な一般的なパターンになると思います。

SELECT
    ID, RowNumber, ((RowNumber + 99) / 100) * 100
FROM
    (
    SELECT
        ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber
    FROM
        Tbl
    ) AS X
于 2012-12-14T23:56:42.333 に答える
1

質問してから5分後に解決策を考えたので、私は自分の質問に答えています。「SELECT MAX()」部分の使用を INSERT ステートメントに移動し、後で使用するために行番号をそのまま残しました (追加の列に必要です)。したがって、INSERT の SELECT 部分では、単純に ROW * 100 を MAX シーケンス番号に追加します。

WITH CTE (PROJECTNUM, COSTCATID, ROW) AS
(  SELECT PROJECTNUM, PACOSTCATID, ROW_NUMBER() OVER(PARTITION BY PROJECTNUM ORDER BY PACOSTCATID) 
   FROM PROJECTSHORTLIST A, CATEGORYTABLE
   WHERE <stuff you don't care about>
)
INSERT INTO PROJECTTABLE
(PAPROJNUMBER, PACOSTCATID, LNITMSEQ)
SELECT PROJECTNUM, COSTCATID, (ROW * 100) + (SELECT MAX(LNITMSEQ) FROM PROJECTTABLE WHERE PAPROJNUMBER = A.PROJECTNUM)
FROM CTE;
于 2012-12-14T23:47:31.320 に答える