AccessでのSQLについて教えてください。同一フォルダ上に3つのmdbがあります。

・MDB1(フォーム用)
・MDB2(テーブル2が存在する)
・MDB3(テーブル3が存在する)

テーブル2にはID,Address
テーブル3にはID,Name
とあります。これを外部結合したいと思っています。キーはIDです。どのように文を組み立てればよいでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2009/04/15 13:09:59
  • 終了:2009/04/22 13:10:02

回答(4件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/04/15 13:51:24

ポイント23pt

異なるファイルにあるテーブルを結合するには、リンクテーブルを利用するのがよいと思います。

http://www.serpress.co.jp/access/no001.html


外部結合に関しては目的に応じて、選択する必要がありますが

http://homepage2.nifty.com/mathpara/programing/access_fulljoin.h...

単純に名前への外部結合であれば、下記のようでどうでしょうか。

SELECT table3.id, table3.name, table2.address FROM table3
LEFT JOIN table2 ON table3.id = table2.id
ORDER BY table3.id
id:akaired

ご回答ありがとうございます!参考にさせて頂きます。

2009/04/16 21:36:55
id:Im_Me No.2

Im_Me回答回数301ベストアンサー獲得回数62009/04/15 13:52:01

ポイント23pt

MDB2のテーブル2、およびMDB3のテーブル3を参照して、

MDB1のフォーム(もしくはレポート)を表示/印字すると言う事でよかったでしょうか?(またはテーブルの更新)

MDB1でMDB2のテーブル2、およびMDB3のテーブル3をリンクして、SQLを作成、もしくはクエリを作成すれば良いかと思いますが…

SQL/クエリの構文はリンクテーブルもローカルテーブルも基本的に同じです。

id:akaired

ご回答ありがとうございます!参考にさせて頂きます。

2009/04/16 21:37:00
id:kn1967 No.3

kn1967回答回数2915ベストアンサー獲得回数3012009/04/15 14:49:18

ポイント22pt

データベース名.テーブル名 とすればアクセス可能になりますので

例えば下記のように記述します。

SELECT T1.*, T2.Address, T3.Name
FROM (テーブル1 AS T1
LEFT JOIN MDB2.テーブル2 AS T2 ON T2.ID = T1.AddressID)
LEFT JOIN MDB3.テーブル3 AS T3 ON T3.ID = T1.NameID
;
id:akaired

ご回答ありがとうございます!参考にさせて頂きます。

2009/04/16 21:37:05
id:Mook No.4

Mook回答回数1312ベストアンサー獲得回数3912009/04/15 17:19:55

ポイント22pt

とりあえず MDB1 のマクロで下記のようで他のファイルを参照できます。

(リンクテーブルを作成しているので、2回目以降はmakeRefTable をコメントアウトしてください。)

Sub main()
    makeRefTable  '初回のみ実行:2回実行するとエラーになります。
    joinSQL
End Sub

Sub makeRefTable()
    Dim myDB As DAO.Database
    Set myDB = CurrentDb
    
    Dim total As DAO.Recordset
    
    Dim objTBLDef2 As DAO.TableDef
    Set objTBLDef2 = CurrentDb.CreateTableDef("ref_table2")
    objTBLDef2.Connect = ";DATABASE=C:\mdb2.mdb"
    objTBLDef2.SourceTableName = "table2"
    myDB.TableDefs.Append objTBLDef2
    
    Dim objTBLDef3 As DAO.TableDef
    Set objTBLDef3 = CurrentDb.CreateTableDef("ref_table3")
    objTBLDef3.Connect = ";DATABASE=C:\mdb3.mdb"
    objTBLDef3.SourceTableName = "table3"
    myDB.TableDefs.Append objTBLDef3
End Sub

Sub joinSQL()
    Dim myDB As DAO.Database
    Set myDB = CurrentDb
    
    Dim sql As String
    sql = "SELECT ref_table3.id, ref_table3.name, ref_table2.address FROM ref_table3" _
     & " LEFT JOIN ref_table2 ON ref_table3.id = ref_table2.id" _
     & " ORDER BY ref_table3.id"
    
    Dim total As DAO.Recordset
    Set total = myDB.OpenRecordset(sql)

    Do Until total.EOF '--- B
        Debug.Print total!id & "/" & total!Name & "/" & total!Address
        total.MoveNext
    Loop
End Sub
id:akaired

ご回答ありがとうございます!参考にさせて頂きます。

2009/04/16 21:37:11
  • id:akaired
    Dim getMDBData2 As DAO.Database
    Dim getMDBData3 As DAO.Database
    Dim get2 As DAO.Recordset
    Dim get3 As DAO.Recordset
    Dim total As DAO.Recordset

    'データベースに接続。getMDBDataはデータベースに接続します。
    Set getMDBData2 = OpenDatabase(MDB2のパス.MDB2.mdb)
    Set getMDBData3 = OpenDatabase(MDB3のパス.MDB3.mdb)

    '上記のコードを利用してleft joinを完成させたいです。
    'また下記のコードも利用したいと思ったのですが、これはgetMDBData2.OpenRecordset....は参照しているDBがMDB2.mdbなどでleft joinは利用できないのでしょうか?

    'Set get2 = getMDBData2.OpenRecordset(SQL文,dbOpenDynaset)
    'Set get3 = getMDBData3.OpenREcordset(SQL文,dbOpenDynaset)

    '外部結合をしたrecordsetをtotalというオブジェクトにセットしたいと思っています。
  • id:kn1967
    データベーススペース(データベースの存在する空間)が違いますので
    SQLによる外部結合は無理です。

    DAOで良いのであれば QueryDefで
    リンクテーブル併用 もしくは、私の回答にあるような方法で
    クエリを作成すれば対処できそうに思いますが
    dbOpenDynaset(書き換えが伴う) という事なので
    いずれにしても単純にはいかず、結合した後で何をやりたいのかという点まで
    もっともっと具体的に説明なさる必要があるでしょう。

    さらに、
    コメント欄でご相談の方法はAccessのSQLではなくDAOの使い方に関するものですから
    新たに質問文を練り直していただき別質問としていただくのでよろしいでしょう。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません