投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/8/9 14:37:42
Access VBA においても、Recordset オブジェクトの内容に対して
「SELECT * FROM  {Recordset1}」のような再問い合わせはできませんでしたよね。
(Recordset 二対して、Filter や Seek や Find などといったカーソル制御に関する機構があるだけ)


最初の例に挙がった DAO の CreateQueryDef や ADOX の Views.Append といったものは、結局のところ、 JET や ACE にとっての CREATE VIEW クエリに相当するものに過ぎません。
(DAO の CreateQueryDef は無名クエリの生成にも使えますが、今回の話とは無関係)

VB.NET でも、CREATE VIEW や CREATE TABLE の SQL を実行することはできますので、
ワークテーブルや VIEW を用いて、そこから再問い合わせを行うことはできるでしょう。
ですがそれはあくまでも Access 側が持つ、ACE / JET の機能に過ぎません。
VB.NET における ADO.NET や DataSet 、VBA における ADODB や DAO とは別物です。



なので Access 側の SQL で処理させるなら、ワークテーブルや VIEW を用いる必要がある、というのが回答になります。

SQL は使わず、VB 側で処理するなら、DataSet のリレーション機能を使ったり、
DataView のフィルターやソート機能を使ったり、LINQ による集計や再加工を行ったりします。

この 2 つはそれぞれ独立したものです。Access にとっての DAO や ADODB がそうであったように。


そもそも DataAdapter や DataSet というのは、Access でいえば、切断型の ADODB.Recordset にあたります。切断型というのは、ActiveConnection が Nothing だが Close されていない、オフライン向けの Recordset のことです。

ADODB において、Recordset の結果を使って別の処理をするとなると、Shape Provider によるリシェイプを利用する必要がありました。(この機能は DAO の Recordset にはありません)
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/reshape-name-property-dynamic-ado
http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=36&no=1

これに相当することで良ければ、DataSet 単体で行えます。
リシェイプ時と同様、JET 側の SQL は使えませんけれどね。


また、DataSet には、複数のテーブルを格納できますが、これはデータベースに繋がなくても利用できます。
ループ処理や LINQ で DataTable の各行を取り出して、新たな DataTable を DataSet に追加したり、
複数のテーブル間でリレーションシップを貼ったり、前回の回答のように「式列」を設けたり、
Compute 句による集計を行うことも出来ます。