MW211 EXIT

devlog
MSSQL/UPDATE文でRANK()を使う
2019年05月22日
[群]ごとの連番を[枝番]として振りたい場合に、
UPDATE文に直接RANK()を使うとエラーとなる。
┌──────────────────────────────────────┐
│UPDATE [表]                                                                 │
│    SET [枝番] = (RANK() OVER(PARTITION BY [群]                             │
│                              ORDER BY [連番] ASC));                        │
├──────────────────────────────────────┤
│ウィンドウ関数は、SELECT 句または ORDER BY 句だけで使用できます。           │
└──────────────────────────────────────┘

これを克服する方法。
┌──────────────────────────────────────┐
│UPDATE [表]                                                                 │
│    SET [枝番] = [入力D].[枝番]                                            │
│    FROM [表] AS [出力D]                                                   │
│        INNER JOIN (                                                        │
│            SELECT [群],                                                    │
│                   [連番],                                                  │
│                   RANK() OVER(PARTITION BY [群]                            │
│                               ORDER BY [連番] ASC) AS [枝番]               │
│                FROM [表]                                                   │
│        ) AS [入力D]                                                       │
│          ON  [入力D].[群]   = [出力D].[群]                               │
│          AND [入力D].[連番] = [出力D].[連番];                            │
└──────────────────────────────────────┘
一旦副表上で[枝番]を生成しておく。
更新対象の[表]とこの副表は、主キーでJOINしないと
副表の先頭一行目(つまり意図しない入力データ)で更新されてしまうので注意。
分類:MSSQL