客先からこんな依頼が・・・
表Aと表Bの情報を任意の条件に合う形でcsvで取り出して出力したい。
通常なら、共通のキー(id)で結合して、情報を取り出せば良いのですが、
少しテーブルの形が特殊でした。
結合したものを取り出すところで少々詰まったので備忘録がてら書いています。
下に要点を絞って示します。
キー名、値は実際とは変えています。横に日本意をつけています。
テーブルA(部品情報)
id_A(管理id) | part_no(部品番号) | Yearfrom(生産年) | ... |
---|---|---|---|
6000 | sample1212 | 2023 | ... |
6005 | sample5342 | 2021 | ... |
6012 | sample3231 | 2022 | ... |
: | : | : | : |
テーブルB(製品製造情報)
id_B(製品id) | company_no(製品番号) | PartsA(駆動部品A) | ... |
---|---|---|---|
1 | AA56BB | sample1212 | ... |
255 | MMKK44 | sample3231 | ... |
399 | LL9KKV | sample5342 | ... |
: | : | : | : |
テーブルの説明をするとテーブルAは部品情報を表したもので部品に対しての生産年、型番などの情報が15カラムに渡り格納されていて、テーブルBはテーブルAの部品を使用して作成される製品についての情報が20カラムに渡り格納されています。
厄介なことにこのテーブルAとB、IDで紐ついているのではなくpart_no(部品番号)とPartsA(駆動部品A)で紐ついており、さらにpartsA以降の20カラムの別の駆動部品の情報とも紐づいていました。
試行錯誤の末に・・・
SQLでカラムを20個結合したりするのは現実的ではないため、UNIONを使ってなるべく計算負荷を減らそうとしましたが、上手くいかず駆動部品の20カラムを共通化したCommon_partsというカラムを加えた中間テーブルCを最終的に作成することにしました。(ちょっとカラムを省きます)
テーブルC(中間テーブル)
id_A(管理id) | id_B(製品id) | part_no(部品番号) | company_no(製品番号) | Common_parts(駆動部品集) | ... |
---|---|---|---|---|---|
6000 | 1 | sample1212 | AA56BB | sample1212 | ... |
6005 | 399 | sample5342 | LL9KKV | sample5342 | ... |
6012 | 255 | sample3231 | MMKK44 | sample3231 | ... |
: | : | : | : | : | : |
後は取り出すだけ
このテーブルCから、目的のカラムを取り出してCSVに出力するだけ。
私は安心していました。
中間テーブルはテーブルA,テーブルBから作成しているため、ざっくりですが、A.part_no,B.company_noとすればカラム情報を取り出せると思っていました。
しかし、実際は取り出すことができず、SQLが悪かったのか色々検討したため、半日ほど色々探す羽目に。
報告期限が迫っているため、焦る焦る。
何が原因だったか
中間テーブルCを作成していたため、そのテーブルからカラム情報を取り出すためにはC.part_no,C.company_noとする必要があった。
意外と盲点だった。
学んだこと
- 中間テーブルを作成し、そこから情報を取り出す際は元のテーブルではなく中間テーブルのカラムを指定すること
- 詰まった時はまずは簡単なことから見直してみること
後書き
エンジニアになってからおおよそ一年になるがアウトプットしようしようと思いながらおざなりになってしまっていた。
駄文かもしれないがアウトプットする機会を増やしていきたい