質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Access

    456questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

accessでのunionの書き方について教えてください

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,500

makino

score 22

質問失礼します。

accessではFULL JOINが対応していないとのことで、
unionを使ってマスタAとマスタBのファイルの中身を全て結合したいと思っています。
(お互いに、商品コードと商品名、単価が記載されており、それを商品コード順にansテーブルへ出力予定)

しかし、下のコードを書くと、JOIN句の構文エラーです。と出てしまいます。
ユニオンクエリでは簡単に出来たのですが、
下のようなコード書くにはどのようにしたらよいでしょうか?

宜しくお願いします。

Sub Key()

Dim cnn As ADODB.Connection 

Dim rs_masterA As ADODB.Recordset 
Dim rs_masterB As ADODB.Recordset
Dim rs_ans As ADODB.Recordset
Dim mySQL As String  

Set cnn = CurrentProject.Connection   
Set rs_masterA = New ADODB.Recordset  
Set rs_masterB = New ADODB.Recordset
Set rs_ans = New ADODB.Recordset

    mySQL = "SELECT T_ALL.商品コード, A.商品, A.単価" & _
    " FROM ((SELECT 商品コード FROM マスタA AS A UNION SELECT 商品コード FROM マスタB AS B)" & _
    " LEFT JOIN A ON T_ALL.商品コード = A.商品コード)" & _
    " LEFT JOIN B ON T_ALL.商品コード = B.商品コード"

    rs_masterA.Open mySQL, cnn, adOpenKeyset, adLockOptimistic
    rs_masterB.Open mySQL, cnn, adOpenKeyset, adLockOptimistic
    rs_ans.Open "ans", cnn, adOpenKeyset, adLockOptimistic

    Do Until rs_masterA.EOF And rs_masterB.EOF
        rs_ans.AddNew 

        rs_ans!商品コード = rs_maseterA!商品コード
        rs_ans!商品名 = rs_masterA!商品名
        rs_ans!単価 = rs_masterA!単価

        rs_ans.Update      
        rs_ans.MoveNext     
        rs_master.MoveNext  
        rs_masterB.MoveNext

    Loop

End Sub
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

T_ALL ってどこにいきましたか。

あと、いま一つやりたいことが分からないんですが UNION でクエリ時点でつなげているならRecordsetをAとBで開く必要はなさそうに思いますし

SELECT A.*, B.*
FROM A LEFT JOIN B ON A.商品コード = B.商品コード

の結果で必要なデータはそろうんじゃないかと思いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/24 10:38

    回答ありがとうございます。
    すいません、ユニオンクエリだとすぐにできたので、それは今回使わないでいきたいです。
    また、自分の認識が誤っていて、JOINしてもrs_masterA.Openとrs_masterB.Openの両方開かないといけないと勘違いしてました。申し訳ございません。

    kaz.Suenagaさんが書いていただいたSELECTだと、
    要求された名前または序数に対応する項目がコレクションで見つかりません
    と出てきてしまいます…
    初心者のよくわからない質問で申し訳ないです。

    キャンセル

  • 2016/03/24 10:47

    表現が悪かったかもしれません。
    `T_ALL` がどこに行った、というのは
    ```
    mySQL = "SELECT T_ALL.商品コード, A.商品, A.単価" & _
    " FROM ((SELECT 商品コード FROM マスタA AS A UNION SELECT 商品コード FROM マスタB AS B)" & _
    " LEFT JOIN A ON T_ALL.商品コード = A.商品コード)" & _
    " LEFT JOIN B ON T_ALL.商品コード = B.商品コード"
    ```

    この部分に、定義されていないテーブル名 T_ALL がでてくるので言ったことです。

    また、私の書いた方のSQLの場合、レコードセット内にAの商品コードとBの商品コードが存在しますので、列名「商品コード」では対応する名前がないとエラーになると思います。

    キャンセル

  • 2016/03/24 11:04

    T_ALL見逃してました…確かにどこにも書いてないですね。

    無事FULLJOINのような動作になりました。
    ありがとうございました!

    キャンセル

  • 2016/03/24 11:05

    蛇足ですが、おそらくはこれがやりたいことなんじゃないかというコード書きました。

    ---

    Sub example1()
    Dim cnn As ADODB.Connection

    Dim rs_master As ADODB.Recordset
    Dim rs_ans As ADODB.Recordset

    Dim mySQL As String

    Set cnn = CurrentProject.Connection
    Set rs_master = New ADODB.Recordset
    Set rs_ans = New ADODB.Recordset

    mySQL = "SELECT * FROM A UNION ALL (SELECT * FROM B)"

    rs_master.Open mySQL, cnn, adOpenKeyset, adLockOptimistic
    rs_ans.Open "ans", cnn, adOpenKeyset, adLockOptimistic

    Do Until rs_master.EOF
    rs_ans.AddNew
    rs_ans!商品コード = rs_master!商品コード
    rs_ans!商品名 = rs_master!商品名
    rs_ans!単価 = rs_master!単価
    rs_ans.Update

    rs_master.MoveNext
    Loop


    rs_ans.Close
    Set rs_ans = Nothing

    rs_master.Close
    Set rs_master = Nothing

    cnn.Close
    Set cnn = Nothing
    End Sub
    ---

    ご参考まで。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Access

    456questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。