結合テーブルクエリPrimaryKey取得について

このQ&Aのポイント
  • 結合テーブルのクエリからPrimaryKeyを取得する方法について質問です。環境はOS/Win7 ACCESS2010です。
  • 質問者は、Tbl_aとTbl_bという2つのテーブルとそれぞれのフィールドを作成しました。そして、Tbl_aとTbl_bを結合するクエリ(Q_AandB)を作成しました。
  • 質問者は、VBAのコードを使用してクエリを実行しようとしましたが、エラーが発生しました。エラーメッセージには、'実行エラー'3251': この操作は、このタイプのオブジェクトには実行できません。'と表示されました。質問者は、結合テーブルでのプライマリキーの取得方法を知りたいとしています。
回答を見る
  • ベストアンサー

結合テーブルクエリPrimaryKey取得について

自己解決できず、どなたかお助けくださいませ。 環境:OS/Win7 ACCESS2010 やりたいことは、結合テーブルのクエリからPrimaryKeyを取得したいのです。 次の2つのテーブルと2つのフィールドを作成したとします。 Tbl_a.Fld_ID / Tbl_a.Fld_Name Tbl_b.Fld.ID / Tbl_b.Fld_Sex ※どちらも Fld_ID フィールド を PrimaryKey 名でINDEX設定します。 ACCESSに次のクエリを作成したとします。 SELECT Tbl_a.Fld_ID, Tbl_a.Fld_Name, Tbl_b.Sex FROM Tbl_a INNER JOIN Tbl_b ON Tbl_a.ID = Tbl_b.ID クエリ名:Q_AandB 次のVBAを作成したとします。 ※引数 VR には10万件の2次元配列 0:ID 1:氏名 2:性別 が入っている Public Sub UpdateExe(Byval VR As Variant) Dim DB As DAO.Database: Set DB = CurrentDB Dim RS As DAO.Recordset: Set RS = DB.OpenRecordset("Q_AandB") Dim Z As Long With RS For Z = 0 To UBound(VR) .Index = "PrimaryKey" ← ここでエラーが出ます。 .Seek "=", VR(Z,1) IF .NoMatch Then .AddNew !Fld_ID = VR(Z,0) 'ID !Fld_Name = VR(Z,1) '氏名 !Fld_Sex = VR(Z,2) '性別 .Update Else .Edit !Fld_ID = VR(Z,0) 'ID !Fld_Name = VR(Z,1) '氏名 !Fld_Sex = VR(Z,2) '性別 .Update End If Next Z .RS.Close End With Set RS = Nothing DB.Close: Set DB = Nothing End Sub これを実行すると、「実行エラー'3251': この操作は、このタイプのオブジェクトには 実行できません。」 とのエラーで弾かれてしまいました。 結合テーブルでのプライマリキーの取得がわからず困っております。 以上、何卒よろしくお願い申し上げます。

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

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

Seek 出来るのはレコードセットタイプがDbOpenTableの場合だけです。 ヘルプより 『インデックス付きのテーブル タイプの Recordset オブジェクトで、現在のインデックスの指定された抽出条件を満たすレコードを検索し、そのレコードをカレント レコード にします 。』 で、 クエリの場合に Set RS = DB.OpenRecordset("Q_AandB", dbOpenTable) と指定しても無効な処理として怒られます。 Seek(Index) を諦めて Rs.FindFirst (やや遅)にするとか Rs.Filter(もっと遅)にするとか じゃないですかね。

hoihoi_book
質問者

お礼

神!

関連するQ&A

  • DTS クエリーデザイナ で更新クエリー

    今回、訳あってSQL2000Severを導入する事になり勉強中です。 今までAccessでDB更新/追加/削除は経験あり、HPを見ても移行は簡単なイメージがありましたが、更新クエリーだけイメージがあいません。 TBL A /TBL B の2つのTBLがあり、TBL Aの項目をTBL Bで更新しようとする場合,Accessならクエリーで2つのTBLを追加してTBL AをTBL Bの項目で更新できたのですが、DTSデザイナで更新を選択するとTBL Aしか追加できません。 又、クエリアナライザを使ってもJOINの後の構文エラーから先に進めない状態です。 初歩的質問で申訳ありませんが、助言できる方がいらっしゃいましたら助けて下さい。 サンプルSQL UPDATE [TBL A] AS A INNER JOIN [TBL B] AS B ON A.KOUMOKU = B.KOUMOKU SET [A].[TANKA] = [B].[TANKA]; キーワード 'AS' 付近に正しくない構文があります。

  • PHP+MySQL 内部結合(INNER_JOIN)がうまく行きません。

    以下の文で「client_master」テーブルと「jobmaster0717」テーブルを内部結合させようとしているのですが、うまく行きません。どこがおかしいのでしょうか? <?php  // データベースサーバへの接続・データベースの選択  $db = mysql_connect('localhost','test','password');  $db_name = 'test';  mysql_select_db($db_name,$db);  // 処理対象テーブル  $tbl_name1 = "client_master";  $tbl_name2 = "jobmaster0717";    // 内部結合(INNER JOIN句)  $str_sql1 = "SELECT * FROM {$tbl_name1}"       . " INNER JOIN {$tbl_name2}"       . " ON {$tbl_name1}.company_ID"       . "  = {$tbl_name2}.client_ID;";  $rs1 = mysql_query($str_sql1,$db);  print "\"{$str_sql1}\"<br>\n";  // 結果セットの表示  show_rs($rs1,$db);  print "<br>\n";  // 結果セット(結果ID)の開放  mysql_free_result($rs1);    // データベースサーバの切断  mysql_close($db); ?>

  • MSAceess テーブル結合でメモリエラー

    Windows XP, MS Access 2007です。 レコード件数700件程度のテーブルTBLに以下のようなカラムがあります。 ID(主キー),NAME,REF_ID1, REF_ID2, REF_ID3,...., REF_ID10 NAMEは当該IDに紐づく名前であり、 REF_ID1~REF_ID10は、当該レコードと関連するレコードのIDを記載したものです。 これをレポート出力する際に、 関連レコードはIDではなく名前を出力したく 以下のようにクエリを作成しました。 SELECT TBL.ID, TBL.NAME, TBL1.NAME AS REF_NAME1, ...., TBL10.NAME AS REF_NAME10 FROM TBL, TBL AS TBL1, TBL AS TBL2, ..., TBL AS TBL10 WHERE TBL.REF_ID1 = TBL1.ID AND ... AND TBL.REF_ID10; しかし、この方法だと結合するテーブル数が多くなるためか、 レポートの表示が非常に遅く、かつ、レポートの最後のページを開こうとすると メモリ不足とのメッセージボックスが出力され、エラー終了してしまいました。 メモリはOSの限界4GBまで積んでいるため、 結合するテーブル数が多すぎるのが問題なのだと思いますが、 どのような方法がよいのでしょうか。

  • ストアドのselect文で別テーブルのカウントを取得するには

    こんばんは。 以下のようなことをするのにどう記述していいのか わかりません。 入力パラメータ test1,test2に一致するテーブル1のレコードの 項目1と項目2の値と test1,test2に一致するテーブル2のレコードの カウントを 返したいと考えていますがどう記述したら テーブル2のカウントを返せるのかわかりません。 以下、考え中の内容を記述したものです。 テーブルTBL_AとテーブルTBL_Bがある。 TBL_Aの項目はFLD_1,FLD_2,FLD_3 TBL_Bの項目はFLD_1,FLD_2,FLD_3,FLD_4 TBL_AとTBL_Bには同一のフィールドFLD_1,FLD_2があり、 select FLD_1,FLD_2,FLD_3 FROM TBL_A WHERE FLD_1 = test1 AND FLD_2 = test2(select文1) 上記のSQLでTBL_AのFLD_1,FLD_2を取得する ここに、 select count(*) FROM TBL_B WHERE FLD_1 = test1 AND FLD_2 = test2(select文2) このselect文2で取得した値を select文1に接続して値を戻したいのですが やり方がわかりません。 戻したい値はTBL_AのFLD_1,FLD_2,FLD_3とTBL_Bのカウントです。 お分かりになる方教えてください。よろしくお願いします。 なおoracleは9iを使っています。

  • ループで呼び出しながら、追加クエリでテーブルに追加

    IDをループで呼び出しながら、追加クエリでテーブルに追加したいのですが、 値が入りません。 エラーなく動くのですが、テーブルに値が入っていないのです。 何がたりないのでしょうか? ――――――――――――― Public Sub CYUSYUTU_SEIKYUID2() Dim CYUSYUTU_SEIKYUID As String Dim recCount As Long recCount = DCount("*", "作業用請求先ID") Dim ID As String Dim DB As DAO.Database Dim RS As DAO.Recordset Dim i As Integer Dim strSQL As String Set DB = CurrentDb Set RS = DB.OpenRecordset("作業用請求先ID") RS.MoveFirst Do Until RS.EOF RS.Edit For i = 1 To recCount CYUSYUTU_SEIKYUID = RS.Fields("請求先ID(13)").Value DoCmd.RunSQL _ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='& CYUSYUTU_SEIKYUID &';" Next i RS.Update RS.MoveNext Loop RS.Close: Set RS = Nothing DB.Close: Set DB = Nothing End Sub

  • 削除クエリについて

    ACCESS2000で開発しています。 現在LOOPで A_TBL と B_TBL を日付とコードでリンクさせ同じデータがあれば削除するという処理をしています。 件数が多いためこれでは時間がかかるため、一括で削除できる削除クエリができないかと考えています。 どなたかご教授お願いします。 <現在のプログラム> SQL="SELECT 年月, コード, 日付 FROM A_TBL AS A INNER JOIN B_TBL AS B ON (A.日付 = B.日付) AND (A.コード = B.コード) WHERE (A.年月='200707')" Set RS = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot) Do While Not RS.EOF SQL= "DELETE * FROM A_TBL WHERE (年月='200707') AND (コード='" & RS!コード & "') AND (日付='" & RS!日付 & "')" CurrentDb.Execute SQL RS.MoveNext Loop RS.Close Set RS = Nothing

  • Access VBAでクエリーのレコード件数を取得したいのですが

    Access2003のVBAで次のような構文を用いてクエリーの該当レコード数を取得したいのですがうまく出来ません。 構文又は手法が間違っているのでしょうか。 Dim db As Database Dim rs As Recordset Dim cnt As Long Set db = CurrentDb Set rs = db.OpenRecordset("該当顧客リストクエリ", dbOpenTable) cnt = rs.RecordCount ※OpenRecordsetの行で「実行時エラー'3219'無効な処理です」と出てしまいます。 又、”該当顧客リストクエリ”では特定の抽出条件を設定して、”顧客リストテーブル”の一部を抽出するようにしています。

  • クエリの遅さの原因

    下記のクエリーをそれぞれ試してみたところ、圧倒的に下の方が遅くなってしまいました。 $rs = mysql_query("select * from A INNER JOIN B ON B.cat = A.id order by B.id desc LIMIT 1, 10 ;",$con); $rs = mysql_query("select * from A INNER JOIN B ON B.cat = A.id where B.name is not null group by B.area order by B.id desc LIMIT 1, 10 ;",$con); where B.name is not null group by B.area この処理はそれほど負荷が掛かってしまうのでしょうか。 他に良い書き方(方法)がありましたら教えてください。

    • ベストアンサー
    • MySQL
  • 3テーブルの外部結合

    3テーブルよりを以下の条件で1つのSELECT文で集計したいのですが可能でしょうか?  ・A_TBLのA単位でB_TBLのNYUKAとC_TBLのSYUKAを集計 <<A_TBL>>   <<B_TBL>>     <<C_TBL>> A  STOCK   B  A NYUKA   C  A SYUKA a01  100    b01 a02 10   c01 a03 10 a02  200    b02 a01 20   c02 a01 20 a03  300    b03 a01 10   c03 a05 10 a04  400    b04 a03 30   c04 a01 30 a05  500    b05 a05 30   c05 a03 20            b06 a02 20   c06 a01 10            b07 a01 10   c07 a03 50 外部結合 SELECT a.A,a.STOCK,SUM(b.NYUKA) AS SUM_NYUKA,SUM(c.SYUKA) AS SUM_SYUKA FROM A_TBL AS a". LEFT OUTER JOIN B_TBL AS b ON a.A=b.A LEFT OUTER JOIN C_TBL AS c ON a.A=c.A". GROUP BY a.A でうまくいきません。3つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。

  • ACCESS97のMAX関数について

    ACCESS97を使用しています。 "関数"の使い方が全くわかりません。 (というより、SQLも含めて…)  テーブル"TBL_A"の"項目B" から最大値を変数SDHSに取得したいのですが どうすればいいのでしょうか?  Dim db As DATABASE Dim RS As Recordset Dim SDHS, strSQL As String Set db = CurrentDb() strSQL = "SELECT Max(項目B) FROM TBL_A ;" Set RS = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) SDHS = Max(項目B)

専門家に質問してみよう