MW211 EXIT

devlog
MSSQL/入力データの順番を出力データに反映させる方法
2018年11月20日
┌──────────────────┬┬──────────────────┐
│            ×ダメな例×            ││             ○いい例○             │
├──────────────────┼┼──────────────────┤
│INSERT INTO [出力D] (              ││INSERT INTO [出力D] (              │
│        [出力ID],                   ││        [出力ID],                   │
│        [データ]                    ││        [データ]                    │
│    )                               ││    )                               │
│    SELECT ISNULL(                  ││    SELECT ROW_NUMBER() OVER(       │
│               (SELECT MAX([出力ID])││               ORDER BY [出力ID] ASC│
│                    FROM [出力]),   ││           ) AS [出力ID]            │
│               0                    ││                                    │
│           ) + 1 AS [出力ID],       ││                                    │
│           [データ]                 ││           [データ]                 │
│        FROM [入力D]               ││        FROM [入力D];              │
│        ORDER BY [入力ID] ASC;      ││                                    │
└──────────────────┴┴──────────────────┘
  左記の例は、一件ずつやる分に問題ない(トリガなどで)。
  だが、まとめてとなると「SELECT MAX([出力ID]) FROM [出力]」は
  初期の値が全件に対して(二件目以降も)適用される。
  なので、「ROW_NUMBER()」を用いる必要がある。

  なお、出力データに既存のレコードがある場合には、複合した以下となる。
┌──────────────────────────────────────┐
│INSERT INTO [出力D] (                                                      │
│        [出力ID],                                                           │
│        [データ]                                                            │
│    )                                                                       │
│    SELECT ISNULL((SELECT MAX([出力ID]) FROM [出力]), 0)                    │
│             + ROW_NUMBER() OVER(ORDER BY [出力ID] ASC) AS [出力ID]         │
│           [データ]                                                         │
│        FROM [入力D];                                                      │
└──────────────────────────────────────┘
分類:MSSQL