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文を直接扱わない方法ばかりが見つかる始末。またもや躓いた。

発想の転換(というか、原点回帰)

煮詰まってしまい、作業を一旦止めてしばらく経った後に、ふと気が付いた。
Accessを編集する必要も、SQL文でフィールド名を取得する必要も無く、もっと簡単で基本的な方法があった。
SELECT文でフィールド別名を書いてしまえばよいのだ。
これならPerlプログラム上で簡単にできるし、Jet SQLでフィールド名を取得する構文を必死に探しまわる必要も無い。

誰も通り抜けない道

難題に突き当たった時、いくら調べても解決策が見付からない場合がある。そんな時は発想の転換が大事だとよく言われるが、つまり、今の今まで誰も解決法を見つけていないという事は、そんな難題は別に解かなくても、発想の転換で別の方法がいくらでも見つけられるという事なのかも知れない。