• 締切済み

Set rst = db.OpenRecordset("SELECT

Set rst = db.OpenRecordset("SELECT a.name FROM tableA inner JOIN TABLEB ON [a].name = [b].name where [a].age <> [a].age", dbOpenDynaset) のようなSQLで、名前は同じで年だけ違うデータを取得して Do Until rst.EOF = True  までデータを書き出す処理をアクセスのモジュールで作成しているのですが、、 なぜか結果が繰り返しでてきてしまいます。 例: たろう 30歳 はなこ 15歳 いちこ 10歳 たろう 30歳 はなこ 15歳 ・・・ のように、たろう~いちこのセットが何度もかかれてしまいます。 EOFとは、あくまでファイルの終わりを意味していて、SELECTの結果が3件の場合でも、 ファイルの30件までは繰り返し処理をしてしまうということでしょうか? 3件だけ出力するにはどうしたらいいのか教えてください。

みんなの回答

  • sppla
  • ベストアンサー率51% (185/360)
回答No.3

>EOFとは、あくまでファイルの終わりを意味していて、SELECTの結果が3件の場合でも、 >ファイルの30件までは繰り返し処理をしてしまうということでしょうか? 1件読むごとにMoveNextしていれば、レコード数までの処理で終わるはずです。 質問からはDoループが無限ループになるようなこともなさそうなのでVBA側での問題ではなくSQLが怪しいと感じます。 >オラクルDB上で実際動かしてはいますし、 この場合に返ってくるデータは期待どおり(上の例ですと3件ですね)でしたか? SQL PlusやAccessのパスクエリーで確認できると思います。(すいませんOracleは詳しくないのでSQLのテスト方法に他の方法があるか知りません。) テーブル構造や格納されているデータについての情報がないのでSQLが正しいかどうかは正しく回答することはできませんが、例えばテーブルA、Bともに下記の2レコードがあったとして(つまりテーブルABはこの例では同一のデータを持っています) たろう 30歳 たろう 20歳 SELECT tableA.name FROM tableA inner JOIN tableB ON tableA.name = tableB.name where tableA.age <> tableB.ageのようなSQLを実行すると、次のように2レコード返ってきます。 たろう たろう (一方はA30歳-B20歳に対応するレコードで、もう一方はA20歳-B30歳に対応するレコードですね。テーブルAの名前しかSelectでは表示していないので同じデータに見えますが・・・) 今ちょっと予想しているのが、1つのテーブルをもとにした自己結合で、同じ名前で異なる年齢のデータを抜き出したい(上の例では1レコードだけ「たろう」と抜き出したい)のに、上記の例のような感じで複数行返ってきてお困りなのじゃないかと思っています。

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.2

DBがAccessVBAと仮定して・・・SQL文を以下のようにしたら希望の結果になりますか? SELECT TableA.name, TableA.age FROM TableA INNER JOIN TableB ON TableA.name = TableB.name WHERE TableA.age<>TableB.age

noname#182251
noname#182251
回答No.1

私には理解しがたいSQLですが。 まずDBというかプラットフォームはなんでしょう?提示されているのはアクセスVBAでしょうか。 a.name FROM だけで年齢も拾うのでしょうか? bテーブルにはどのようなデータが入っているのでしょうか? where [a].age <> [a].age 同じテーブルの年齢が違うレコードという指定も良く判りません もしアクセスVBAならば、VBA以前に単純なSQL文(クエリ)でデータの抽出を試みた方が良いでしょう。

makikorin
質問者

補足

すみません・・・。 会社のDB名やテーブル名を使っているので、コピーするわけにはいかず、いろいろと言葉を変更していたらおかしなSQLになってしまっていました。 構文がおかしいわけではないんです。 オラクルDB上で実際動かしてはいますし、 今やろうとしているのはアクセスのVBAでのSQLです。 失礼しました。

関連するQ&A

  • 複数表からのカウント(2)教えてください

    前回の質問と関連しますが 今度は複数の人について 以下のような処理を行うときのクエリーでうまくいか ないのですがどのようになおせばいいでしょうか。 よろしくお願いします <table A> n id name 1 1 yoshida 2 2 tanaka <table B> n id sub score 1 1 AAA 100 2 1 BBB 100 3 1 CCC 50 4 2 AAA 80 5 2 BBB 100 6 2 CCC 50 <result> name count yoshida 2 tanaka 1 tableAとtableBの2つの表があり tableAの2人(以上あり)のscoreが100である subの数をカウントしたい場合 SELECT tableA.name as Name, count(*) FROM tableA, TableB where(tableA.id = tableB.id and tableB.score = 100 )

    • ベストアンサー
    • MySQL
  • 1つのテーブルから複数のテーブルへのデータ振分け

    MySQLを使用して、tableAというテーブルのデータを tableB,tableC,tableDというテーブルに振り分けたいと思っています。 1日1回、自動的に行いたいと思っています。 たとえば、tableAのテーブル構成が下記のようなもので ================== name sex birth address phone email company ================== name,address,phoneはtableBに name,sex,birthはtableCに name,companyはtableDに分けるというような イメージです。 私の考えでは、下記のようなSQL文をPHPから呼び出して、タスクで 実行させてそれぞれ別のテーブルに振り分けようと思っている のですが、、もっと良いツールや方法があればお教えいただけ ませんでしょうか。 宜しくお願いいたします。 ---------------------------------------------------------------------------------------------------- INSERT INTO tableB (name,address,phone) SELECT tableA.name,tableA.address,tableA.phone FROM tableA AND INSERT INTO tableC (name,sex,birth) SELECT tableA.name,tableA.sex,tableA.birth FROM tableA AND INSERT INTO tableD (name,company) SELECT tableA.name,tableA.company FROM tableA; ----------------------------------------------------------------------------------------------------

  • 複数表からのカウントを教えてください

    <table A> no name 1 yoshida 2 tanaka <table B> no sub score 1 german 100 1 english 100 1 science 50 tableAとtableBの2つの表があり 1 yoshidaさんが100点をとった科目の数を (ここでは2となります) カウントしたいのですが以下の_________で どのように入力したらいいでしょうか 先週から始めたばかりで表の入力はできるよう になったのですがカウントのしかたがよく わかりません よろしくお願いします SELECT tableA.no as No, tableA.name as Name, ___________________ FROM tableA, TableB where(tableA.no = tableB.no and tableB.score = 100 and tableB.no = 1 )

    • ベストアンサー
    • MySQL
  • SQLiteのUPDATE文を教えてください。

    UPDATE tableA, tableB SET tableA.name = tableB.name WHERE tableA.id = tableB.id; 上記のSQLが他のデータベースでは動きますが、SQLiteでは動きません。 同意味のSQLはどう書くのでしょうか。お願いします。

  • 3つのテーブルを結ぶSQLの書き方

    お世話になります。 3つのテーブルを結びつけるSQLの書き方がわかりません。ご指導お願いします。 [TableA][ID] [TableB][ID] [TableC][ID] [TableA]と[TableB]をLEFT JOINでつなぐ。 上の結果を[TableA][ID]と[TableC][ID]でInner joinでつなぐ。 つまり・・・ SELECT TableA.ID,TableB.ID FROM TabelA LEFT JOIN TableB→この結果 SELECT TableA.ID,TableB.ID TableC.ID From この結果 INNER JOIN TableC ON TableA.ID = TableC.ID こんな感じのことをやりたいのですが、記述の方法がわかりません。 どなたかお知恵をお貸しください。

  • SQL:テーブル結合で該当レコードがない場合

    SELECT TableA.ID,SUM(TableA.量),TableB.金額 FROM TableA,TableB WHERE TableA.ID = TableB.ID GROUP BY TableA.ID,TableA.量,TableB.金額 こんな感じのSQLなんですが TableAをメインテーブルとして ↓のような結果を得るように作り変えれないか考えています ■TableBとの結合レコードあり(金額登録あり) 1,50,1500 ■TableBとの結合レコードあり(金額登録なし) 1,50,(NULLかスペース) 考えているんですが思いつかないのでヒントいただけたらと思います。宜しくお願いします。

  • OpenRecordSet  他について

    Accessプロジェクトを使用しています。 Dim strSQL As String Dim DBS As Database Dim RST As DAO.Recordset Set DBS = CurrentDb Set RST = DBS.OpenRecordset("TESTDATA", dbOpenDynaset,dbReadOnly) 「実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。」 と出てきます。デバッグを押すと、 上記最終行でSTOPします。 次のように変更しても同じでした。 Set RST = DBS.OpenRecordset("TESTDATA") 又は Set RST = DBS.OpenRecordset("TESTDATA", dbOpenDynaset) ヘルプ等を見ると、Jetワークスペースでのみ 使用可と出てきます。 ADO,DAO,OpenRecordset等が理解しきれていないように思うのですが、 Access97(DAO?)では 何も出てこなかった上記のような内容、 何故Accessプロジェクトでは 上手くいかないのでしょうか?

  • テーブルの内容で更新したいのですが

    下記のようにテーブルがあります。 TableA colA colB ---- ----  A   1  B   2  C   3 TableB colA colB ---- ----  A   1  A   2  C   3 TableAに対してTableBとcolAが一致するcolBの合計を加算したいのです。 結果として TableA colA colB ---- ----  A   4  B   2  C   6 AはTableBに2レコードあるので合計3が加算されて4 BはTableBにレコードがないので変わらず2 CはTableBに1レコードあるので3が加算されて6 SQLでこのような更新処理(update)はできないでしょうか? よろしくお願い致します。

  • 演算子の件です。

    演算子の件です。 例えば、 a.field と b.fieldが等しいデータと抽出 SELECT * FROM tablea AS a, tableb AS b WHERE a.field = b.field はOKなのですが、 a.field に b.fieldが含まれるデータと抽出 SELECT * FROM tablea AS a, tableb AS b WHERE a.field like %b.field% は駄目でした。 値であれば %atai% でOKだと思うんですが、フィールドを指定した値で 任意文字等を指定することは可能なのでしょうか?

    • ベストアンサー
    • MySQL
  • ACCESSテーブル2つのデータの比較について

    アクセステーブル2つのデータ比較について質問があります、 宜しくお願いいたします。 Access, Excel, VBは初心者レベルです。 TableA,TableBというフォーマットが同じなテーブルがあり、 データが同じかを比較をし、どちらかのテーブルにないエントリーが ある場合はそれを出したいと思います。 途中まで出来たのですが、uniqueではないデータがある為に正確な情報がでません。 具体的には: TableA        | TableB Field1 Field2 | Field1 Field2 AAA 10 | AAA 10 BBB 100 | BBB 100 CCC 200 | CCC 200 CCC 200 | EEE 100 DDD 100 | 希望の答えは Field1 Field2 Field3 CCC 200 NotInB <--- これがでません DDD 100   NotInB  <--- これはだせました EEE 100 NotInA  <--- これもだせました 以下のようなものを書いたのですが、CCCのエントリーがTableBに 一件あるので件数が違うにもかかわらずひけませんでした。 SELECT TableA.*, "NotInB" as Field3 FROM TableA LEFT JOIN TableB ON (TableA.Field1=TableB.Field1) AND (TableA.Field2=TableB.Field2) WHERE TableB.Field1 Is Null; UNION ALL SELECT TableA.*, "NotInB" as Field3 FROM TableA RIGHT JOIN TableB ON (TableA.Field1=TableB.Field1) AND (TableA.Field2=TableB.Field2) WHERE TableA.Field1 Is Null; 一致したらフラグを立てて、再チェックしないようにすればいいのだと思うのですが、アクセスのクエリ、VBなどでどのようにすればできますか?  もしくはアクセスからxlsなどに落としてから、ファイルの状態で比較 (会社で使うので外部ソフト等が使えません) をVBでするといった方法を検討した方がいいのでしょうか? 色々調べてみたのですが、どっちもやり方が分からないので、 それはそもそも出来ないよなどの アドバイスもございましたら、どうぞ宜しくお願いいたします。

専門家に質問してみよう