Access のクエリで「JOIN式はサポートされていません」が表示される
原因が分からず、四苦八苦したので、自分のメモとして記載。
ググってみる
基本ですね、一人で長時間悩むより、詳しい人に聞いてみる。
しかし出てくる情報は あいまいな外部結合 だから、と言うモノ。
例として、3つ以上のテーブルで外部結合(OUTER JOIN)を含んだ結合を行った際、結合条件(ON句)が適切ではないという事らしい。
しかし・・・
今私が結合しているテーブルは二つ。
結合条件は単純。
でも、内部結合(INNER JOIN)だと、エラーが出ない。
外部結合(RIGHT JOIN や LEFT JOIN)だと、エラーが出る。
だから、原因は「あいまいな外部結合」なんだと思う。
前提条件
先に示しておくべきだったのでしょうが、今回の環境は下記の通り。
オラクルのデータベースとリンクされたリンクテーブル A
B
C
が有り、A
B
は加工の為、クエリ A
B
が生成されています。
(サブクエリでやろうかと思ったけど、エラーが出た時にサブクエリが原因かと思い、この形にしました)
さてこの状態で、下記の様にクエリ A
の KEYCODE と、テーブル C
の LINKCODE を結合条件にしたクエリを作成。
SELECT QUERY_A.NAME TABLE_C.SUBJECT FROM TABLE_C LEFT JOIN QUERY_A ON TABLE_C.LINKCODE = QUERY_A.KEYCODE;
このようにして、クエリを作成した所、「JOIN式はサポートされていません」 のエラーが出たわけです。
こういう時、普通はクエリ A
を疑うのでしょうが、ほぼ同等のデータ加工をしているクエリ B
を利用強いて、下記の様に作成したクエリは、エラー無く動作するのです。
SELECT QUERY_B.ADDRESS TABLE_C.SUBJECT FROM TABLE_C LEFT JOIN QUERY_B ON TABLE_C.LINKCODE = QUERY_B.KEYCODE;
クエリの結果をテーブルにしてみる(Oracleとのリンクを断つ)
そうなると、怪しいのはリンクテーブル元の、OracleDB のテーブル A
。
そこで、クエリ A
のデータ加工内容はそのままに、テーブル作成クエリ(SELECT INTO)に変更して、テーブル A2
を作成して、それをテーブル C
と外部結合する事にしました。
SELECT TABLE_A2.NAME TABLE_C.SUBJECT FROM TABLE_C LEFT JOIN TABLE_A2 ON TABLE_C.LINKCODE = TABLE_A2.KEYCODE;
こうした所、「JOIN式はサポートされていません」のエラーが出なくなりました!
結論
単純で「JOIN式はサポートされていません」が出なさそうなクエリでも、リンクテーブルの場合、リンクの環境等によって、「JOIN式はサポートされていません」のエラーが出る事がある。