プロが教える店舗&オフィスのセキュリティ対策術

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件だけ出力するにはどうしたらいいのか教えてください。

A 回答 (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レコードだけ「たろう」と抜き出したい)のに、上記の例のような感じで複数行返ってきてお困りなのじゃないかと思っています。
    • good
    • 0

DBがAccessVBAと仮定して・・・SQL文を以下のようにしたら希望の結果になりますか?



SELECT TableA.name, TableA.age FROM TableA INNER JOIN TableB ON TableA.name = TableB.name WHERE TableA.age<>TableB.age
    • good
    • 0

私には理解しがたいSQLですが。



まずDBというかプラットフォームはなんでしょう?提示されているのはアクセスVBAでしょうか。
a.name FROM だけで年齢も拾うのでしょうか?

bテーブルにはどのようなデータが入っているのでしょうか?

where [a].age <> [a].age 同じテーブルの年齢が違うレコードという指定も良く判りません

もしアクセスVBAならば、VBA以前に単純なSQL文(クエリ)でデータの抽出を試みた方が良いでしょう。

この回答への補足

すみません・・・。

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

失礼しました。

補足日時:2010/06/25 17:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!