ADOでクエリ結果を異なるデータベースに追加するには?

解決


shun  2010-11-03 02:05:41  No: 39476

お世話になります.
データベース関係のプログラミングをしております.

特にADOに関していくつか疑問があるのですが,
TADOQueryでデータベースのテーブルからSELECTした結果に対して,
1.その結果自体に対して再度クエリを行う.
2.TADOTableで開いているデータベースにその結果を追加する.
3.クエリを行ったデータベースとは異なるデータベースにクエリ結果をテーブルとして追加する.

といったことはできるのでしょうか?(以上3つは独立した質問です)
具体的なやり方がわかりません.

特に3つ目が行いたく,
SELECT  〜  INTO  〜では結果を同じデータベースのテーブルにしか出力できないような気がするのですが,異なるデータベースにテーブルを追加したいと考えています.

よろしくお願いします.


s  2010-11-03 09:55:23  No: 39477

1.
単純にViewを作って、その結果をSELECTすることが可能なら
一気に書くことが可能なのでは?

3.
ORACLEなんかでスキーマが異なるだけなら
schema_A.TABLE = schema.TABLEのように書けそうですけど
DBが違うとやはり別のオブジェクトを作成しないと無理かと。
1.の応用でDB_AにDB_BのリンクViewが作れるDBなら
何とかなりそうですけど。


shun  2010-11-03 12:50:30  No: 39478

回答ありがとうございます.
参考にさせていただきます.

3.に関してなのですが,よく調べたところSQLであればIN句を使うと実現できるとのことでした.

しかし,IN句の書き方で分からないことがあるので質問を続けさせてください.
簡単な実験として,Table2を持つデータベースを接続したTADOQueryにて,以下のSQLを書き,
それとは異なるデータベースにTable1を作成しようとしました.

SQL.Add('SELECT * INTO Table1 IN "" "C:\Users\sample.mdb"; FROM Table2');

しかし,ODBCドライバが「'[]'のかっこの使い方が正しくありません」というエラーを出します.

ちなみに同じTADOQueryでも以下のSQLは正常に動作しました.
SQL.Add('SELECT * FROM Table1 IN "" "C:\Users\sample.mdb";');

両者ともIN句の内容は同じなのですが,1つ目のSQLだけエラーになります.1つ目はどのように書けばよいのでしょうか?

申し訳ありませんが,具体的な情報が抜けていました.
開発はDelphi7でデータベースはMS Accessです.
ADOからODBC接続しています.

よろしくお願いします.


s  2010-11-06 12:23:24  No: 39479

失礼しました。クエリで気が付くべきでした。それはさておき
>SELECT * FROM Table1 IN "" "C:\Users\sample.mdb";
はOKとのことなのですが

>SELECT * INTO Table1 IN "" "C:\Users\sample.mdb"; FROM Table2
は、まずSQLの文法的に少し変です。
* のあとのカンマがない、mdb"; のセミコロンは多分いらないとか
そもそも何をしたいのかワカラナイ

適当に書くけど、大体こんな感じではありませんか?
INSERT INTO Table1 IN "C:\Users\sample.mdb" (field1,field2...)
VALUSE (     <- VALUSEはいらんかも
SELECT  field1,field2...  FROM Table2 IN "C:\Users\sample.mdb"
)
自宅にはOFFICEとか開発環境入れてないので未確認です。


shun  2010-11-09 01:44:43  No: 39480

回答ありがとうございます.
教えていただいたように記述してみましたがうまく行きませんでした.
ODBCドライバから同じようにかっこの使い方が正しくないというエラーが出ます.

説明が不十分で申し訳ありませんでした.

やりたいことは
例えば,source.mdb内のTable1からSELECTした結果をsample.mdbにTable2として新規作成することです.

調べた結果,以下サイトの「構文」でnewtable [IN externaldatabase]の部分を設定することで実現できるのではないかと考えました.
http://office.microsoft.com/ja-jp/access-help/HP001032266.aspx?CTT=1

しかし,上記サイトにあるように,「IN 句」の記述方法
http://office.microsoft.com/ja-jp/access-help/HP001032240.aspx?CTT=5&origin=HP001032266
の通りに設定してもうまく行かず,

いろいろ試行錯誤していたところ,外部からSELECTする場合である2つ目は
>SELECT * FROM Table1 IN "" "C:\Users\sample.mdb";
と書いてみたところたまたまうまくいきました.

ちなみに,セミコロンはなくても動きましたがIN直後の""はないといけないようです.
○SELECT * FROM Table1 IN "" "C:\Users\sample.mdb"
×SELECT * FROM Table1 IN "C:\Users\sample.mdb";

しかし,同様に1つ目を書いてみたのですがうまく行きません.

実は,作成中のソフトは,一つのデータベースファイルだけを操作するものならすでに正常に動いているものがあります.今回はその中の一部のテーブルを外部データベースに保存する作業をしていますので,SQLの文法も含め,問題なのはIN句の設定方法だと思うのですが,どうにもうまく行きません.
どうぞ引き続きご協力頂けたら幸いです.


佐助  2010-11-09 05:10:46  No: 39481

接続先のMDB(source.mdb)から外部MDBにコピー
SELECT * INTO Table2 IN "C:\Users\sample.mdb" FROM Table1


shun  2010-11-10 13:27:28  No: 39482

佐助さん,ありがとうございます.
気付くべきでしたが,パスはシングルクォーテーションで囲まないとダメなようです.
×'SELECT * INTO Table2 IN "C:\Users\sample.mdb" FROM Table1'
○'SELECT * INTO Table2 IN ''C:\Users\sample.mdb'' FROM Table1'

ありがとうございました.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加