個人事業主の方必見!確定申告のお悩み解決

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「Nullの使い方が不正です」のエラー

AccsessとVB間でデータの参照・登録・削除を行うプログラムを作成中です。
テキストボックスにデータを入力せずに更新するとAccess側はNull値が入るので、参照をした際に
「Nullの使い方が不正です」のエラーが表示されます。

Null値が表示可能ならその方法を教えてください。

Aベストアンサー

読み込んだ際にIsNull()で判断してみては?
If IsNull(Fields) Then
Text1.Text = ""
Else
Text1.Text = Fields
End If

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QACCESS(VBA)でエクセルファイルを開く時

VBAでエクセルファイルを開いて処理していますが
一つのエクセルファイルを開いている時に(これは手操作)
VBAからエクセルファイルを開くと
一瞬、開いたような反応を示すのですが
すご、閉じてしまい
用を足しません
こんな時、VBAで今開こうとするエクセルファイルを
優先的に開けたら、と思いますが
むりでしょうか?
よろしくお願いします

Aベストアンサー

以下の方法で開けませんか?

Sub ExcelCreate()
Set MyExcel = CreateObject("excel.application")
'MyExcel.Workbooks.Open FileName:="C:\test.xls" '<---既存のエクセルブックを開く場合
MyExcel.Workbooks.Add '<---新しくエクセルを生成する場合
MyExcel.Visible = True
End Sub

QAccess 別テーブルにある値を抽出条件にしたい

OS:WindowsXP SP3
使用ソフト: Microsoft Access2003


選択クエリにて、別テーブルのフィールドにある値すべてを抽出条件にできますか?


ホームページに来て頂いた方の検索キーワードを集計しております。
テーブル1には『検索キーワード履歴』フィールドがあり、お客様が使用した検索キーワードが入力されています。(約2万件)
テーブル2には『除外キーワード候補』フィールドがあり、不要なキーワードが入力されています。(約10件)


クエリにて、『検索キーワード履歴』から『除外キーワード候補』の値を全て除いた結果を出力させたいのですが、
抽出条件をどのように指定したらいいのか分かりません。

そもそも、別テーブルのフィールドにある値すべてを除外させる抽出条件って指定できるのでしょうか。
SQLを用いる方法でも構いませんので教えてください。

Aベストアンサー

SELECT * FROM テーブル1
WHERE NOT EXISTS
(SELECT * FROM テーブル2 WHERE テーブル1.検索キーワード履歴 = テーブル2.除外キーワード候補)
OR 検索キーワード履歴 IS NOT NULL
とか
SELECT * FROM テーブル1
WHERE 検索キーワード履歴 NOT IN (SELECT 除外キーワード候補 FROM テーブル2 )
ということ?
1フィールドに1キーワードの場合です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング