はじめに
カテゴリIDと、そのカテゴリ内の小グループIDを保持しているデータがあり、カテゴリ名と小グループ名を取得したいとき、クエリの作成に苦戦したので、備忘録として取得した方法を記載します。
データ構造
メインのデータ(data_list)
id | categoryGroupNo | subGroupNo | quantity |
---|---|---|---|
1 | 1 | 1 | 10 |
2 | 1 | 2 | 5 |
3 | 2 | 1 | 6 |
4 | 2 | 2 | 0 |
カテゴリグループ(category_group)
categoryGroupNo | categoryGroupName |
---|---|
1 | 果物 |
2 | 野菜 |
小グループ
果物グループ(fruit_group)
subGroupNo | subGroupName |
---|---|
1 | りんご |
2 | みかん |
野菜グループ(vegetable_group)
subGroupNo | subGroupName |
---|---|
1 | キャベツ |
2 | 白菜 |
クエリの作成
「カテゴリグループ名」と「小グループ名」を取得するSQLクエリを作成します。
SELECT
dl.id,
dl.categoryGroupNo,
cg.categoryGroupName,
dl.subGroupNo,
CASE
WHEN dl.categoryGroupNo = 1 THEN fg.subGroupName
WHEN dl.categoryGroupNo = 2 THEN vg.subGroupName
ELSE NULL
END AS subGroupName,
dl.quantity
FROM
data_list dl
LEFT JOIN
category_group cg
ON dl.categoryGroupNo = cg.categoryGroupNo
LEFT JOIN
fruit_group fg
ON dl.categoryGroupNo = 1 AND dl.subGroupNo = fg.subGroupNo
LEFT JOIN
vegetable_group vg
ON dl.categoryGroupNo = 2 AND dl.subGroupNo = vg.subGroupNo;
クエリの説明
- データ一覧を基に情報を取得:
- メインのテーブル data_listを取得
- カテゴリグループ名を結合:
- category_group テーブルを category_group_no で結合し、カテゴリグループ名を取得します。
- 小グループ名を条件で取得:
- CASE 文を使用し、category_group_no の値に応じて対応するテーブル(fruit_group、vegetable_group)を結合し、小グループ名を取得します。
実行結果
実行すると以下のようにグループ名、小グループ名が取得できました。
id | categoryGroupNo | categoryGroupName | subGroupNo | subGroupName | quantity |
---|---|---|---|---|---|
1 | 1 | 果物 | 1 | りんご | 10 |
2 | 1 | 果物 | 2 | みかん | 5 |
3 | 2 | 野菜 | 1 | キャベツ | 6 |
4 | 2 | 野菜 | 2 | 白菜 | 0 |