• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセス2010 他テーブルを参照してCount)

Access 2010で異なるテーブルを参照してCountする方法

このQ&Aのポイント
  • Access 2010で異なるテーブルを参照してCountするには、DCount関数を使用します。
  • テーブルAの[F1]列の値の末尾が「1」である条件を満たすレコードに対して、テーブルBの[F1]列の数をカウントします。
  • DCount関数を使用することで、目的の結果を得ることができますが、処理時間がかかることがあります。より効率的な方法があれば、それを検討することをおすすめします。

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

  • ベストアンサー
回答No.2

ちなみに、テーブルA、テーブルB のレコード件数は何件ぐらいですか。 > >rs2.Index = "F1" > でつまずき、先に進めませんが、 テーブルB の「F1」フィールドにインデックスは設定してありますか。 設定してないとエラーになります。 一時テーブル(テーブルC)を使うなら、 [C1] フィールドの「インデックス」プロパティを「はい(重複あり)」に設定しておいて、下記のコードを実行でどうでしょうか。 CurrentDb.Execute "DELETE * FROM テーブルC" CurrentDb.Execute "INSERT INTO テーブルC ( C1 ) " & _ "SELECT Left([F1],1) FROM テーブルA " & _ "WHERE F1 Like '*1';" CurrentDb.Execute "UPDATE テーブルB INNER JOIN テーブルC " & _ "ON テーブルB.F1 = テーブルC.C1 " & _ "SET テーブルB.F2 = [F2]+1;"

situmonnsya
質問者

お礼

>テーブルA 5,000件~10,000件 >テーブルB 20件~150件 上記を1セットとして、同じ構造でデータの違うセットが10本です。 >"SET テーブルB.F2 = [F2]+1;" "SET テーブルB.F2 = テーブルB.F2+1;"にしました。 こんなことができるんですね。 ただ最初は、F2の規定値がNullだったので結果がでませんでしたが「0」の規定値でうまくできました。 結果、 早い!!!瞬時です。 早いというより、処理中って感じがないです。 Count関数はやはり重い処理なんですね。Dcountはもっと? おかげ様で快適なデータベースになりました。 今後もよろしくお願い致します。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

まずは、テーブルA の F1 にインデックスを設定しておいて、 DoCmd.RunSQL _ "UPDATE テーブルB SET テーブルB.F2 = " & _ "DCount(""*"",""テーブルA"",""F1 Like '*1' AND F1 Like '"" & [F1] & ""*'"");" これでダメなら、DAO か ADO で更新する方法です。 テーブルA の F1 と テーブルB の F1 にはインデックスを設定しておいてください。 また、DAOに参照設定が必要です。 Dim stSQL As String Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset stSQL = "SELECT [テーブルB].F1, COUNT([テーブルA].F1) AS F2 " & _ "FROM テーブルB INNER JOIN テーブルA " & _ "ON [テーブルA].F1 Like [テーブルB].F1 & '*' " & _ "WHERE [テーブルA].F1 Like '*1' " & _ "GROUP BY [テーブルB].F1;" Set rs1 = CurrentDb.OpenRecordset(stSQL, dbOpenSnapshot) Set rs2 = CurrentDb.OpenRecordset("テーブルB", dbOpenTable) rs2.Index = "F1" Do Until rs1.EOF rs2.Seek "=", rs1!F1 rs2.Edit rs2!F2 = rs1!F2 rs2.Update rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing

situmonnsya
質問者

補足

hatena1989様、いつもありがとうございます。 ひとつ目の方法は >F1 にインデックスを設定 Dcount  ほとんど変わらず、でした。 ふたつ目の方法 >rs2.Index = "F1" でつまずき、先に進めませんが、 stSQL文をクリエデザインの「SQLビュー」に書き試してみましたが、速度は変わりませんでした。 そこで、 テーブルAの文字データをLeft,Rightで分解し、1文字のテーブルを作り "INSERT INTO テーブルC ([C1]) SELECT Left(テーブルA.[F1],1) FROM 条件" "INSERT INTO テーブルC ([C1]) SELECT Mid(テーブルA.[F1],2,1) FROM 条件" "INSERT INTO テーブルC ([c1]) SELECT Mid(テーブルA.[F1],3,1) FROM 条件" [F1] a b a a a h c d g h それをテーブルBを参照して、Countする方法はないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アクセス2010 他テーブルを参照してCount

    アクセス2010 テーブルA [F1] ab1 aa1 ah0 cd1 gh0 を元に、頭1文字の重複行を削除したテーブルBがあります テーブルB [F1] [F2] a..........0 c..........0 g..........0 テーブルB[F2]に テーブルA[F1]の最後1文字が「1」である条件下での数をカウントしたい。 [F1] [F2] a..........2 c..........1 g..........0 DoCmd.RunSQL "UPDATE テーブルB (F2) SELECT Count(*) FROM テーブルA Where テーブルA.F1 Like '???1' And テーブルB[F1]=Left(テーブルA[F1],1) ;" みたいな感じで・・・?? よろしくお願い致します。

  • アクセス複数テーブル時のORDER BY の記述

    アクセス2010です 以下のようにテーブルB.F2の上位2のF1とテーブルCのF1を足したテーブルAを作りたいのですが。 ORDER BY はどこに記述するのでしょうか? DoCmd.RunSQL "INSERT INTO テーブルA (F1) " + _ "SELECT TOP 2 テーブルB.F1+テーブルC.F1 + _ "FROM テーブルB, テーブルC " + _ "Where ~~~ ORDER BY テーブルB.F2 ;" 上記のようにすると「テーブルB.F1+テーブルC.F1」計算後の上位2となってしまいます。 ----------- テーブルB (F1,F2) 長嶋,30 王,100 張本,20 ---------- テーブルC (F1) キョジン ハンシン ---------- テーブルA 張本キョジン 長嶋キョジン 張本ハンシン 長嶋ハンシン ---------- としたいが、 ---------- テーブルA 張本キョジン 長嶋キョジン ---------- になってしまいます。 ご教示お願い致します。

  • ACCESSのモジュールでのUNION

    ACCESS超初心者です。 モジュールでテーブルAとBテーブルBを結合しテーブルCを作成したいのですが、 DoCmd.RunSQL " SELECT * FROM TABLE_A UNION SELECT * FROM TABLE_B INTO TABLE_C; " でRunSQL実行時のエラー(2342)となってしまいます。 きっと基本的なことだと思うのですが・・・ どうぞお教えください。

  • アクセス2010 EXISTSの使い方

    テーブルA F1 F2 あい False いえ True おか True きく True けこ False テーブルB F1 あ か け TB1にTB2が含まれるデータを抽出して テーブルC F1 あい けこ をつくりたい。 DoCmd.RunSQL "INSERT INTO テーブルC (F1) " + _ "SELECT F1 From テーブルA " + _ "Where F2=False And " + _ "EXISTS (SELECT * FROM テーブルB WHERE テーブルA.F1 Like '*テーブルB.F1*' );" としたのですが、追加件数は「0」です。 Likeの使い方が悪いのか、EXISTSが悪いのか? どのようにしたらTB3の結果を得られるでしょうか?

  • Access2010 テーブルのフィールドについて

    Access2010を使用しています。 テーブルのフィールド定義 [A][B][C][D][E][F][G] ↓ テーブルを開くと [A][B][C][E][F][G][D] と勝手に変わる (あるフィールドだけ、別の場所に移動) ↓ フィールドの並び順を [A][B][C][D][E][F][G] に戻す ↓ 保存してテーブルを閉じる ↓ 再度開くと [A][B][C][E][F][G][D] と変わってしまう。 この繰り返しです。 どなたか、お助け下さい。 よろしくお願いいたします。

  • WHERE句に複数テーブルを使いたい

    アクセス2010です。 テーブルA F1__テキスト(重複あり) F2__数字 テーブルB F1__テキスト(重複なし) F2__Boolean 条件 ・テーブルAのF2が1の条件で ・テーブルAのF1にテーブルBのF2がない ・テーブルBのF2がTrueであるものだけ DoCmd.RunSQL INSERT INTO テーブルA(F1,F2) SELECT テーブルB.F1,100 FROM テーブルB WHERE テーブルA.F2 = 1 And テーブルA.F1<>テーブルB.F1 And テーブルB.F2 = True; WHERE句に複数テーブルを使いたい時は、どのようにするのでしょうか?

  • access一部のフィールドを他のテーブルへVBA

    先日 https://okwave.jp/qa/q10245651.html において > table2の新しいデータとして > table1のデータをコピーしたい、 単に追加で ということであれば、という 御回答: Sub Test() Dim StrSQL As String StrSQL = "INSERT INTO table2 SELECT table1.* FROM table1;" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True End Sub ---------------------- 上記の 回答をいただき うまく稼働しました 部分的にフィールドを別テーブルに 移動するとき ここでは table1のフィールド名 IDに table2のフィールド名 bに 入っている数値 にい 1を加えた数値を 移動したいのですが Public Function Test() Dim tb1 As Table Dim tb2 As Table tb1 = table1 tb2 = table2 Dim strSQL As String strSQL = "INSERT INTO table2![ID]SELECT"("[b]"FROM tablel)+1" (table1のフィールド[b]の数値に1を加えた数値を table2のフィールド[ID]に移行する、というつもりです) DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End Function 稼働しません すみません 宜しくお願い致します (ついでながら ここで でてくるb というのは テーブル table3 の IDの総和 すなわち SELECT Count(table3.ID) AS b FROM table3; 要は table3の最後のレコードの次のレコードの 番号の数値を table2のIDに移動したい というわけであります) (いずれのIDや bについても 数値型 長整数型 重複あり です)

  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • テーブルの作り方について

    はじめまして。 SQLは初心者なんですが、テーブル構成の仕方について質問です。 ある場面で使用するのは、A,B,C,D,Eというデータで、 別のある場面で使用するのは、A,B,F,G,Hという場合にはテーブル(A,B,C,D,E,F,G,H)を作って1つのテーブルにするのはいいのでしょうか?悪いのでしょうか? メンテナンスや、大量のデータ取得などをするのにこの構成が適しているのかどうかがわかりません。 別々に作るのと、まとめて作ることそれぞれの メリット、デメリットがあったら教えてください。

  • ACCESS テーブルのRENAME

    お力お貸し下さい!! Aテーブル(作成日5/5)商品コード・作成日・数量 Bテーブル(作成日5/6)〃 Cテーブル(作成日5/7)〃 と、3つのテーブルがあります。 クエリで商品テーブルと3つのテーブルを結び、日々の数量の変化を表にしたいと思っています。 DoCmd.Renameを使い、 BテーブルをAテーブルへ CテーブルをBテーブルへ 最新の情報をCテーブル(テーブル作成クエリ)とし、 商品と結んだクエリをデザインで開いたら、 Aテーブルが2つ(一つはリンクなし) Bテーブルが2つ(〃)と、開けないものになってしまいました。 (FROM句で~Aテーブルを繰り返すことは出来ません)とエラー。 きっと、テーブル名を変えた段階で、クエリに反映してくれている?せいだと思いますが(手動でやってもそうなので) なにか良い方法は無いでしょうか? アイデアが浮かばず、また技術が伴わず困っています。。