業務でAccessDBを触ることになった。
今までOracleDBしか触ってこなかった自分だけど、
まあSQLなんてどれも大体似てるでしょw
なんて思ってた。
現に似てる部分もあるけど、やっぱり少しずつ違ってくる。
普段AccessDBを触る人にとっては普通なんだろうけども、
結合に関しては、本当に驚かされることが多かったのでご紹介。
目次
テーブル結合でリテラルを使うことができない
これはほんとに驚いた。
以下、例。
1 2 3 4 5 6 |
SELECT * FROM MST_ANIMAL INNER JOIN MST_SEISOKUCHI ON MST_ANIMAL.AREANAME = MST_SEISOKUCHI.AREANAME AND MST_SEISOKUCHI.KION = '30' |
超適当な例だけど、
動物マスタ(MST_ANIMAL)と生息地マスタ(MST_SEISOKUCHI)があります。
その二つのテーブルを’AREANAME‘で内部結合しました。
ここまではおkなんです。
その後、生息地マスタから気温が’30‘に等しい項目だけをとってこようとすると、エラー吐くんです。
多分「JOIN式はサポートされていません」とかなんとかで怒られる。
逆に以下、うまくいく例。
1 2 3 4 5 6 7 8 9 10 11 |
SELECT * FROM MST_ANIMAL INNER JOIN (SELECT * FROM MST_SEISOKUCHI WHERE MST_SEISOKUCHI.KION = '30') ON MST_SEISOKUCHI.AREANAME = MST_ANIMAL.AREANAME |
リテラルを結合句の条件に使いたい場合は、
副問い合わせの中のWhere句で書いてやる必要がある。
めんどくさすぎない?
複数のテーブル結合がめんどくさい
これがまためんどくさい。
以下、うまくいかない例
1 2 3 4 5 6 7 |
SELECT * FROM MST_ANIMAL INNER JOIN MST_SEISOKUCHI ON MST_ANIMAL.AREANAME = MST_SEISOKUCHI.AREANAME LEFT JOIN MST_SHUZOKU ON MST_ANIMAL.SHUZOKU = MST_SHUZOKU.SHUZOKU |
多分これも「JOIN式がサポートされていません」というエラーで怒られるはず。
以下、うまくいく例
1 2 3 4 5 6 7 |
SELECT * FROM (MST_ANIMAL INNER JOIN MST_SEISOKUCHI ON MST_ANIMAL.AREANAME = MST_SEISOKUCHI.AREANAME) LEFT JOIN MST_SHUZOKU ON MST_ANIMAL.SHUZOKU = MST_SHUZOKU.SHUZOKU |
一回目の結合が終わったところで、結合句をカッコで括ってやればよいのだ。
結合するテーブルの数が少ないのであれば別に問題はないが、
4つ5つのテーブルを結合しながら、且つ、結合句にリテラルが入ってくるなら溜ったもんじゃあない。
結合?見にくくなる?With句使えばよくね?
と思うじゃん?
AccessにWith句は存在しないのだ。
結果:AccessSQLはクソ。
この記事へのコメントはありません。