2017-02-23 3 views
0

私が開発しているアクセスデータベースのフォームを開く際に問題が発生しています。クエリは停止せずに実行されています。私はそれを手動で停止する必要があります(以下のアクションは実行されません)。フォームを開くと、コードのこの部分を実行すべきで :ものがフィールド1表1のフィールド1と一致しているフィールド3 = 0及びこれらのレコード間を、記録する言い換えるアクセスデータベースのフォームを開く際のsqlクエリ

Private Sub Form_Load() 

DoCmd.SetWarnings False 
DoCmd.RunSQL "UPDATE Table1 SET Field1 = Null WHERE EXISTS(SELECT * FROM Query2 WHERE Query2.Field2 = Table1.Field2 AND Query2.Field3 = 0 AND Query2.Field1 = Table1.Field1)" 
DoCmd.SetWarnings True 

End sub 

を、iはQUERY2に確認する必要がありField2はTable1のField2に一致します。これらのレコードが特定されると、Table1のField1のレコードの値をNullに設定します。

For example (i put in "code" aspect to have this part more readable, but it's not code, only an example) 

Table1.Field1 | Table1.Field2 
ABC    12345 
DEF    67891 

Query2.Field1 | Query2.Field2 | Query2.Field3 
ABC    12345   5   --> this record is not selected 
DEF    12345   0   --> this record is not selected 
DEF    67891   0   --> this record is selected and value of DEF in Table1 is deleted (Null) 

エラーが発生しましたか?あなたはそれを行う方法がありますか?私はSQLについて多くのことを知っていません。 私は

おかげで、 ダイアン

+0

これらのテーブルにはどのくらいの行がありますか(おおよそ)? –

+0

これはパフォーマンス上の問題のようです。少量の行を持つテーブルに対しても同じことを試してください。すべてのクエリで 'WHERE'と' JOIN'で使用されているすべてのテーブルフィールドがインデックスされているかどうかをチェックします。 –

+0

ご返信ありがとうございます。私はそれぞれ2000レコードが好きです。インデックスを確認しましたが、1つのフィールドがインデックスに登録されていませんでした。私はいくつかのレコードで試してみました、それは動作します。これを行うより良い方法はありますか? – Diane

答えて

0

は、私がしようと最初にすることは、ほとんどのデータベースエンジンでいる間

WHERE EXISTS(SELECT 1 FROM Query2 WHERE Query2.Field2 

WHERE EXISTS(SELECT * FROM Query2 WHERE Query2.Field2 

を変更することです...それは十分に明確に願っています2つの間に違いはありません、アクセスでは違いが生じるかもしれません。

これが役に立ちます。

EDIT:

ことはあまり助けにはならなかったので、私がしようと次のことは、次のとおりです。

UPDATE Table1 
INNER JOIN Query2 ON Query2.Field2 = Table1.Field2 AND Query2.Field3 = 0 AND Query2.Field1 = Table1.Field1 
SET Table1.Field1 = Null; 

あなたが最初のテストデータベースに対してこれを実行していることを確認してください。

HTH。私がしました

+0

あなたの答えに感謝します。私はこれをテストしたが、何の改善も見られず、まだまだずっと長い。他のアイデア? – Diane

+0

編集されています –

0

助けのおかげで、私は最終的には別の方法でそれをやった、おそらくそれは非常にきれいではありませんので、私はプログラマではないんだけど、それは私の目的に適しています:-)

ファーストbit2を修正して2つの条件に制限する 次に、新しいテーブルにクエリのデータをエクスポートします 次に、私が興味を持っていないすべてのレコードを削除します 次に、残りのレコードを使用してテーブル1を更新します、クエリーは迅速です)。より多くの手順がはるかに速く...

Private Sub Form_Load() 
DoCmd.SetWarnings False 

'Append data of query2 to table2_temp 
DoCmd.OpenQuery "query2" 

'Delete some records in table table2_temp 
DoCmd.RunSQL "DELETE * FROM table2_temp WHERE table2_temp.field3 <> 0" 

'Delete value in field1 and field2 of table1 where field2 exists in table2_temp 
DoCmd.RunSQL "UPDATE table1 SET field1 = Null WHERE EXISTS(SELECT * FROM table2_temp WHERE table2_temp.field3 = table1.field2)" 


'Empty the temp table 
DoCmd.RunSQL "DELETE * FROM table2_temp" 

DoCmd.SetWarnings True 

End Sub 
関連する問題