MW211 EXIT

devlog
SQL/優先順位台帳
2017年09月27日
優先順位を決めた優先順位台帳がある場合に、それを反映させる方法。
(干支を例とした優先順位台帳の場合)

優先順位順に並び替えるには、結合してあげればよい。
┌──────────────────────────────────────┐
│WITH 優先順位台帳 (                                                         │
│         順位,                                                              │
│         値                                                                 │
│     ) AS (                                                                 │
│          VALUES (1, '子'),                                                 │
│                 (2, '丑'),                                                 │
│                 (3, '寅')                                                  │
│     )                                                                      │
│SELECT 表.キー,                                                             │
│       優先順位台帳.順位,                                                   │
│       表.干支                                                              │
│    FROM 表                                                                 │
│        INNER JOIN 優先順位台帳                                             │
│          ON 優先順位台帳.値 = 表.干支                                      │
│    ORDER BY 表.キー           ASC,                                         │
│             優先順位台帳.順位 ASC;                                         │
└──────────────────────────────────────┘

グループ毎に最優先のものを洗い出すには、
一度結合して、最優先の順位を探して、さらに結合して
その最優先の順位の値をもってくる形になる。
┌──────────────────────────────────────┐
│WITH 優先順位台帳 (                                                         │
│         順位,                                                              │
│         値                                                                 │
│     ) AS (                                                                 │
│          VALUES (1, '子'),                                                 │
│                 (2, '丑'),                                                 │
│                 (3, '寅')                                                  │
│     )                                                                      │
│SELECT 別表.集合キー,                                                       │
│       優先順位台帳.値,                                                     │
│       優先順位台帳.順位 AS 干支                                            │
│    FROM (                                                                  │
│        SELECT 表.集合キー,                                                 │
│               MIN(優先順位台帳.順位) AS 順位                               │
│            FROM 表                                                         │
│                INNER JOIN 優先順位台帳                                     │
│                  ON 優先順位台帳.値 = 表.干支                              │
│            GROUP BY 表.集合キー                                            │
│    ) AS 別表                                                               │
│        INNER JOIN 優先順位台帳                                             │
│          ON 優先順位台帳.順位 = 別表.順位;                                 │
│    ORDER BY 表.キー ASC;                                                   │
└──────────────────────────────────────┘
これをCASE文にて(CASE文をネストさせて)以下のようにやってしまうこともできる。
┌──────────────────────────────────────┐
│SELECT 集合キー,                                                            │
│       CASE MIN(CASE 干支                                                   │
│                  WHEN '子' THEN 1                                          │
│                  WHEN '丑' THEN 2                                          │
│                  WHEN '寅' THEN 3                                          │
│                END)                                                        │
│         WHEN 1 THEN '子'                                                   │
│         WHEN 2 THEN '丑'                                                   │
│         WHEN 3 THEN '寅'                                                   │
│       END AS 干支                                                          │
│    FROM 表                                                                 │
│    WHERE 干支 IN ('子','丑','寅')                                          │
│    GROUP BY 集合キー                                                       │
│    ORDER BY 集合キー ASC;                                                  │
└──────────────────────────────────────┘
なお、いずれも想定外の値(優先順位台帳にない値)は無視する想定である。
分類:SQL