Perl DBIでAccessクエリに接続し、データをハッシュの配列で取得する際、キーが重複する事がある
クエリの中に複数のテーブルでリレーションを作った場合、SELECT文で取り出す際のフィールド名は、「テーブルA.フィールドB」という風に表される事がある。特に、複数のテーブルに同じフィールド名が使われている場合、これがないとフィールドの区別が付かなくなる。
Perl DBIからmdbファイルに接続した場合に起こるフィールド名の重複
SQLではフィールド名は一意に定義されるので、そのような心配は無いが、Perl DBIで取り出す時、ドットで区切られたフィールド名のドットより前の部分が削げ落ちてしまうため、selectall_hashrefなどでハッシュとして取り出したい時、重複するフィールド名のデータのうち片方が欠落する。
また、ステートメントハンドルのNAME属性からフィールド名を取得した場合も同じように重複することがあるので、同じフィールド名の区別は順番で付けるしかない。
解決策
Accessクエリを編集してフィールド別名を付けるとか、ハッシュではなく配列で取り出すとか、いくらでも回避する方法はあるが、それぞれ難点がある。
Accessファイルを更新した場合、複数人で使っている場合のバージョン管理が面倒であり、更新できない場合もある。
配列を使った場合、フィールド名を配列の添字に変えながらプログラムを打つのは効率が悪く、見た目も分かりづらくなる。また、Accessデータのテーブル構造が更新された場合、順番の変動に対応するためにプログラムを修正する量が多くなる。(組み方次第で減らす事は可能だが。)
そこで、フィールド名をステートメントハンドルのNAME属性からではなくSQL命令で取り出し、二次元配列で取り出したテーブル内容に関連づける事でハッシュ配列に変換するという方法を思いついた。
大抵のSQLエンジンなら、テーブル構造を取得するための命令の書き方は用意されているだろうと、Accessで使われているJet SQLでのテーブルからフィールド名を取り出すSQL文の書き方をネットで探してみるが、見つからない。SQL文を直接扱わない方法ばかりが見つかる始末。またもや躓いた。