• ベストアンサー

複数のデータベースを検索したい

困っている内容ですが、 別々のサーバに構築されたAとBというデータベースがあります。 そのAとBにADOによる接続を行いますが、 AとBのテーブルを結合して情報を取得したいと考えています。 SQL文で言うと、 顧客情報はデータベースAに 顧客詳細はデータベースBに存在するテーブルであり 会員IDはそれぞれのテーブルにある SELECT * FROM 顧客詳細 INNER JOIN 顧客情報 ON 顧客情報.会員ID = 顧客詳細.会員ID のようなことがしたいのです。 テーブルを読み込む場合 '' ADO接続オブジェクト Dim adoCon As ADODB.Connection '' 新しいADOレコードセットオブジェクトを作成する Set rs = New ADODB.Recordset '' 読み取り専用でテーブルを開く rs.Open SQL, adoCon, adOpenForwardOnly, adLockReadOnly と書いていまして、adoConの部分が1つのADO接続オブジェクトしか設定できません。 どうにかして2つのデータベースをまたがって 結合できないものでしょうか? 環境は Win2000 + VB6 + SQLSERVER2000 です。 DB初心者なので、説明がうまくいかないと思いますが、 もしおわかりの方がいましたらよろしくお願いします。

  • soma3
  • お礼率94% (18/19)

質問者が選んだベストアンサー

  • ベストアンサー
  • angband
  • ベストアンサー率51% (86/168)
回答No.1

残念ながらこれはSQLだけでは困難かと思います。 ADOでもDAOでも内部では最終的にDBMSを使うためには SQL文を発行しますが、SQLには異なったデータベース内の テーブルを同時に連結できる書式は存在しません。 しかし、MS Jetエンジンであればリンクテーブルという 機能で顧客情報だけ外部から連結できるので、MS SQLでもこの機能が使えないのか調べてください。 あとMS SQLで使えるかわかりませんが、CREAT E TEMPORARY TABLE文で一時的に連結用の顧客情報を用意することもできるかもしれません。

soma3
質問者

お礼

早速の返事ありがとうございます。 教えていただいた、リンクテーブルとCREAT~を 少し調べてみようと思います。

soma3
質問者

補足

TEMPORARYはSQL SERVERでは使用できないようで、 SQLポケットリファレンスによるとテーブル名の先頭に#を付けたりしてテンポラリテーブルであると指示するようです。

その他の回答 (1)

回答No.2

SQL Serverのオンラインヘルプの「分散クエリ」~「リンクサーバー名を使用したデータソースの識別」とか「アドホック名を使用したデータソースの識別」及び「OPENROWSET」は参考になりませんか?

soma3
質問者

お礼

助言ありがとうございます。 オンラインヘルプも参考にして調べてみようと思います。 何を調べるべきなのかもわからなかったので、 大変助かります。

関連するQ&A

  • 異なるデータベースでのSELECT INTO

    昨日と同じところでつまずいているのですが、 みなさまご助言お願いいたします。 タイトルのようにSELECT INTO構文を 2種類のデータベースにまたがって使用したいと思っています。 Dim adoConA As ADODB.Connection 'データベースA Dim adoConB As ADODB.Connection 'データベースB Dim rs As ADODB.Recordset Dim sSQL As String sSQL = "SELECT * FROM 顧客情報" ' データベースAからテーブル取得 rs.Open sSQL, adoConA ' 取得したテーブルをデータベースBに新しいテーブルとして保存 ????? 実際には、SELECT INTOは無理かなと思い、 上記のように、一度レコードセットに取得して それをテーブルBに保存すると言う方法を行おうと 思っているのですが、やり方がわかりません。 もちろん、別の方法でも可能ならば 別の方法でも構いませんので、 おわかりになるのであれば教えてください。

  • 複数のテーブルに対して・・・

    過去に同様の質問があったかも知れませんが、Accessのバージョンがかなり古いので質問させて下さいね。 Access97(すみません、ホント古くて…)で、下のような顧客情報管理ファイルを作成しました。 テーブルA<→フォームA> ・顧客ID(主キー: テキスト型) ・氏名 ・情報A1, A2~ ・入力フォームB~への移動ボタン(同一IDレコードの表示) テーブルB<→フォームB> ・顧客ID(主キー: テキスト型) ・情報B1, B2~ テーブルC<→フォームC> ・顧客ID(主キー: テキスト型) ・情報C1, C2~ 最初からテーブルA~Cを結合したものを作ればよかったのですが、 それぞれのテーブルについて細かい入力項目が30~40個あるため、 分割して作成してしまいました(そして今後もテーブルは増える可能性大です)。 現在、テーブルAにだけ、20人分のデータが入っています。 今後も顧客数やテーブルが増える予定なのですが、 その都度テーブルごとに顧客IDをいれるのが面倒になってきました。 そこでお訊ねしたいのですが、テーブルA(を元にしたフォームA)に顧客IDを入れると、 テーブルBやCにも同じテキストが入力されるような設定は可能でしょうか。 最初、クエリーで連結しようとしたのですが、 既にテーブルAにいくつかデータが入っているせいか、どうも上手く反映されません。 単に私の参照方法が下手だったからかもしれませんが…。

  • ASPから異なる複数のDBサーバーに接続する方法

    ASPの質問です。WEBサーバーと複数のDBサーバーがあります。 ADODB.Connectionでオラクルサーバーに接続し、データベースオブジェクトを作成しています。 別々のDBサーバーにあるテーブルを結合して利用したいのですが、ASPで可能でしょうか? 例えば"select * from A,B where A.ID=B.ID"というSQL文を実行する(AとBは別々のDBサーバーにある)。 とりあえず、代替案で検討しているのは片方のDBサーバーにデータベースリンクで他方のDBサーバーのVIEWを作ろうかと思っています。できればASPで解決したいのですが、よろしく御願いします。

  • EXCELからORACLEのテーブルをselectしたいのですが、うま

    EXCELからORACLEのテーブルをselectしたいのですが、うまくいきません。 ご指導のほどお願いいたします。 下記サンプルをネット('Access VBA Tips)で探し実行しました。 Access版だからいけないのでしょうか? adoCON.Open "DSN=company_viewer; UID=jxxx; PWD=yjxxx;" のオープン・クローズは正常終了します。 Set adoCON = Application.CurrentProject.Connection が実行できません。 実行時エラー 438 オブジェクトはこのプロパティまたはメソッドをサポートしていません。 が出てしまいます。 Excelではだめなのでしょうか? 教えてください。 よろしくお願いいたします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー--------------- Sub prcAdoOracleODBC() 'Access VBA Tips '4.3 ORACLEのDBを開く・閉じる/ODBCを使う Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset '?ADOを使いADRSODBCというデータソースをオープンします adoCON.Open "DSN=company_viewer; UID=jxxx; PWD=yjxxx;" 'データベースのオープン(データベースオブジェクトの作成) Set adoCON = Application.CurrentProject.Connection 'レコードセットの作成(SELECT文の実行) Set adoRS = adoCON.Execute("select * from casUR") 'レコードセットのクローズ adoRS.Close 'データベースのクローズ adoCON.Close 'オブジェクト変数のクリア Set adoRS = Nothing Set adoCON = Nothing End Sub

  • Access 複数テーブルをまとめる

    こんにちは! 過去記事を検索しましたが、該当がなく、苦戦しております… お知恵をお貸し下さいm(__)m テーブル T顧客…顧客ID(主キー)、名前、… T書類1…顧客ID(重複キー有)、書類1ID、… T書類2…顧客ID(重複キー有)、書類2ID、… T書類3…顧客ID(重複キー有)、書類3ID、… T書類4…顧客ID(重複キー有)、書類4ID、…  ・  ・  ・ その他に複数同じような構造のテーブルがあります。 テーブル内には他に様々なフィールドがありますが、同一内容の結合できるフィールドは上記のみです。 上記のテーブルですべての書類IDを取ってきたいのですが、 全テーブルを顧客IDと結合し、選択クエリで抽出すると      顧客ID | 名前 | 書類1ID | 書類2ID | 書類3ID | 書類4ID  1  |  Aさん |  10  |  5 |  20  |  26  1  |  Aさん |  10  |  30 |  20  |  25  1  |  Aさん |  10   |  4 |  20  |  26  1  |  Aさん |  10   |  6 |   20  |  25  2  |  Bさん |  30  |  13 |  25  |  5  2  |  Bさん |  30   |  10 |  26  |  5  2  |  Bさん |  30   |  13 |  26  |  5  2  |  Bさん |  30  |  10 |  25  |  5 のような値が出てきてしまいます…当たり前の結果ですが… やりたいこととして、 (1)一つのテーブルかクエリで抽出 顧客ID   名前   書類1ID   書類2ID   書類3ID   書類4ID  1     Aさん   |  10  |  5  |  20  |  26               |     |  30  |     |  25               |     |  4               |     |  6    2     Bさん   |  30  |  13  |  25  |  5               |     |  10  |  26   のように重複をなくし、 (2)更にまとめたものにしたいです。 顧客ID   名前   書類1ID   書類2ID   書類3ID   書類4ID  1     Aさん     10     5,30,4,6     20     25,26  2     Bさん     30      10,13     25,26     5 最終的に上記にまとまったものをフォームにして、顧客IDごとに抽出し、 顧客ごとの各書類のIDはこれとこれですよ!みたいにしたいのです! 説明が下手で申し訳ありませんm(__)m Access初心者で、独学でコツコツやっているので、知識が乏しいです… 調べてみるとユニオンクエリとかでできるような記事はありますが、 SQL文なども理解ができずに苦戦しております… お手数ですが、ご教示の程 よろしくお願い申し上げます。

  • データベースを複数作ったほうが良いでしょうか?

    Win+Apache+PHP+MySQLで、自宅サーバを立てています。 データベース名:DB_A  テーブル:Table_A データベース名:DB_B  テーブル:Table_B とするべきか、 データベース名:DB_A  テーブル:Table_A,Table_B とするべきか悩んでいます。 データベースについてあまり理解していないのですが、データベースを分けると何がどう変わるのでしょうか? (分けたほうが、高速化するのでしょうか?利点など教えていただければありがたいです。)

  • ACCESSで複数テーブルのクエリ抽出

    ACCESSで複数テーブルのクエリ抽出 初めて投稿させてもらいます。 テーブル1・・・社員ID(主キー)、氏名 テーブル2・・・社員ID(重複キー有)、顧客ID テーブル3・・・社員ID(重複キー有)、得意先ID テーブル4・・・顧客ID、顧客氏名 テーブル5・・・得意先ID、得意先 上記のテーブル内容を1つのクエリで全部抽出するとき、 テーブル1の社員ID[a]とテーブル2の社員ID[a] と テーブル1の社員ID[a]とテーブル3の社員ID[a] を分けて抽出する方法ってありますか? クエリの結合プロパティで テーブル2の全レコードとテーブル1の同じ結合フィールドと テーブル3の全レコードとテーブル1の同じ結合フィールドにすると 「あいまいな外部接続が含まれているのでSQLを実行出来ません」とエラーになり、 テーブル1の全レコードとテーブル2の同じ結合フィールドと テーブル1の全レコードとテーブル3の同じ結合フィールドにすると 社員ID[a]、顧客ID[1]、得意先ID[α]、顧客氏名[吉田]、得意先[○○商事] 社員ID[a]、顧客ID[1]、得意先ID[β]、顧客氏名[吉田]、得意先[△△金融] みたいになってしまうのです。 やりたい結果は 社員ID[a]、顧客ID[1]、得意先ID["空欄"]、顧客氏名[吉田]、得意先["空欄"] 社員ID[a]、顧客ID["空欄"]、得意先ID[β]、顧客氏名["空欄"]、得意先[△△金融] 説明下手ですいませんが、ご教授の程よろしくお願いします。

  • PostgreSQLのデータベースについて

    PostgreSQLにて AとBというデータベースがあると仮定し、 AにはA1,A2,A3というテーブルがあるとし BにはB1,B2,B3というテーブルがあるとします。 抽出時Bの中のテーブルであれば結合を行い 一度で抽出が色々行え速度向上を行えるのですが、 データベースがBとAと分かれている時、一度Bで検索 をかけそのデータをAに渡し新たに検索というスタイル を使わなければなりません。 そこで、AのA1というテーブルデータをそのままの形で Bのデータベースへ移動する事は出来ないでしょうか? もちろんPHP等でプログラムを組んで再構築すれば 出来るのはわかりますが、もっとシンプルに出来れば と思い質問させて頂いております。

  • Accessでの検索結果表示

    Accessでの検索画面を作っているのですが *検索項目* ・顧客ID ・電話番号 ・氏名(前方一致で検索したい) *顧客テーブル* ・顧客ID ・電話番号 ・氏名 ・氏名カナ ・住所 3つを複合的な検索項目として、検索ボタンを押下した際に フォーム上のテキストボックスに顧客テーブルから 検索した住所を表示させたいと思っています。 現在、顧客コードだけを 検索項目として以下のようなコードを記述しているのですが これでさえもうまくいきません。 *************************** Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strRet As String Set cn = CurrentProject.Connection rs.Open "顧客テーブル", cn, adOpenKeyset, adLockOptimistic strRet = "顧客ID='" & Me!CustmID & "' " rs.Find strRet If Not rs.EOF Then Me.Address = rs!住所 Else: MsgBox "該当なし" End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub **************************** 現状、何が悪いのかそしてどのようにこのプログラムを 改良すれば本来やりたいことができるのか 教えていただけますでしょうか。よろしくお願いいたします。

  • VB6の複数検索条件で連続検索が出来ないので教えて下さい

    下記のごとく、ADOデーターベースの複数アンド条件で検索をしているのですが、一番最初のレコードは検索されるのですが、次の検索をしようと思い、rs.movenextを実行しても次のレコードに飛んで検索をしてくれません。たった一度のみの検索となります。 連続検索を行いたいのですが分かりません。 どなたか、詳しい方がおられましたら宜しくお願い致します。 Public Sub Multi_find(ByRef oRs As ADODB.Recordset, sCriteria As String) Dim clone_rs As ADODB.Recordset Set clone_rs = oRs.Clone clone_rs.Filter = sCriteria If clone_rs.EOF Or clone_rs.BOF Then oRs.MoveLast oRs.MoveNext Else oRs.Bookmark = clone_rs.Bookmark End If clone_rs.Close Set clone_rs = Nothing End Sub

専門家に質問してみよう