私が例外的に好きだといったMicrosoft社製アプリケーションMicrosoft Access。なぜ好きなのかと問われれば、お気軽にデータベースを構築できるというその点くらいだったりする。使っていると不満が出てくるのはまあ当然であるが、手軽さ、便利さを考えると致し方ない。直接テーブルを開いて修正を加えたり、そういう乱暴な運用ができるのはAccessくらいなもんだろう。
だが大抵の不満は我慢できる。バージョンが2000になってからはデータが勝手に書き換えられてしまうバグはなくなったみたいだし(少なくとも私はこの手のバグに遭遇したことがない。気付いてないだけかも知れんが)、モジュールがぶっ壊れることも頻繁ではない(ただ、こまめにバックアップはとるようになった)。Wordからオブジェクトを貼り付けると印刷で目茶苦茶になるのも、始めからレポートで処理するようにすればいいだけだ。レポートでオブジェクトの配置が中途半端に面倒というのも、そもそもなんで拡大表示ができないのかという問題も、まあ我慢できないこともない。このように、私はつくづく寛容なユーザーなのである。
ただ、我慢できないことはあって、それはなにかというと、折角丹精込めて書いたSQLを書き換えてくれるというあの仕様だ。
ソースを書き換えるアプリケーションといえば、一昔前のグラフィカルHTMLエディタが思い出される。どれほど丁寧にきちんとHTMLを書いたとしても、そのアプリケーションで開けば、目茶苦茶に書き換えられる。目茶苦茶というのはまさにその言葉通りの意味で、文書型宣言を消してしまったり、p要素やli要素の終了タグをことごとく消してしまったり、hr要素をp要素内にわざわざ配置してくれたり、等々。私が使ったことのあるこの手のエディタはクラリス・ホームページであり、あの当時、本当に正しくHTMLを書こうという気などはまったくしなかった。一生懸命書いたとしても、一瞬で粉砕してくれるし、そもそもHTMLに正しさがあるということをそうしたツールは教えてくれない。私がHTMLの意義を知ったのはDreamweaverに移行してからの話で、基本的にソースを書き換えることをしないDreamweaverのお行儀のよさに、私は感動したのだった。
いや、考えるまでもなく、Dreamweaverの仕様が当たり前なんだけどな。
Accessのクエリはその当たり前が守られていない。Accessの売りは、SQLの知識がなくてもグラフィカルなインターフェイスでクエリを作成できるということであって、そして直接SQL文を書くこともできるという柔軟性である。その便利さや意義はよくよく理解しているし、SQLをちまちま書くより楽に作れるようなケースもあるから、ありがたいとは思っている。しかしそのグラフィカルなインターフェイスではどうやったらいいかわからないような場合は、はっきりいってSQL文を書いたほうが早い。複雑な結合やサブクエリを使う場合は、SQL文で書くしかないんじゃないだろうか。
SQL文を書く場合、人間が読んで分かりやすいように書くのが普通だ。インデンテーションをしない私のソースは一般的に読みにくいとは思うが、少なくとも自分には分かりやすい。だがAccessは、折角読んで分かりやすいように書いたソースを、自分に都合のよいように書き換えてしまうのだ。
私は集計の際にサブクエリを多用する傾向があり、特にFROM句にサブクエリを使う(しかもそれを左結合するのが好きだ)。サブクエリをFROMに入れて左結合する場合、私は次のように書くのが普通だ。
SELECT a.field, b.field
FROM Table a LEFT JOIN (
SELECT field
FROM Table
WHERE field = y) b ON a.id = b.id
WHERE field = x
ところが、これをAccessに任せてしまうと、次みたいに書き換えられてしまう。
SELECT a.field, b.field
FROM TableA AS a LEFT JOIN [SELECT id, field FROM TableB WHERE ((field) = y)]. AS b ON a.id = b.id
WHERE ((field) = x)
サブクエリがひとつだけならまだ読めなくもないが、ふたつみっつと増えていけば読みづらさはこの上もなくなる。極力書き換えられないように、SQLビュー以外では開かないようにするのだが、それでもなにかの拍子に書き換えられるみたいで、そうなったらもう最悪だ。SQLに対応して強調表示してくれるエディタにコピーして、分かりやすく書き直して戻すという、本来なら不要な作業が発生してしまうことがあるのだな。
あと、書き換えられて困るのは関数やWHERE句の中身で、特にNOTを使って書いた否定やあとISNULL()などもやられてしまう。ISNULLなんてのは、そのフィールドがヌルだったらTRUEを帰すんだから、関数を置くだけで条件判断できるというのに、わざわざ= TRUEみたいなものを括弧付で補ってくれるからかなわない。自分の書くSQLが読みやすいというつもりはないが、なおさら加えて読みにくくしてくれる必要はどこにもないのであって、こんな余計なことで作業の効率を落としてくれるAccessを恨めしく思うことはしばしばだ。
私はAccess 2000しか使ったことがないのでそれ以降のバージョンではどうなのか知らないのだが、多分変わってないんじゃないだろうか。いずれにせよ、ソースを勝手に書き換えることだけは勘弁願いたい。