2017-02-23 44 views
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 

换句话说,我需要在QUERY2,以检查那些记录字段3 = 0和这些记录中,哪些具有字段1匹配表1的字段1和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条记录。我检查了索引,一个字段没有索引。我已经尝试了几个记录,它的工作原理。有没有更好的方法来执行此操作? – Diane

回答

0

我想尝试的第一件事就是改变

WHERE EXISTS(SELECT * FROM Query2 WHERE Query2.Field2 

WHERE EXISTS(SELECT 1 FROM Query2 WHERE Query2.Field2 

虽然在大多数的数据库引擎两者之间没有区别,在Access中可能会有所作为。

希望这会有所帮助。

编辑:

自认为没有多大帮助,接下来的事情我会尝试是:

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

感谢您的帮助,我终于做到了以不同的方式,我不是一个程序员,所以也许它不是很干净,但它很适合我的目的:-)

我第一次修改了一下query2限制为2条件 然后我将查询的数据导出到一个新表中 然后我删除了所有我不感兴趣的记录 然后我用剩下的记录更新table1(最后很少,所以查询很快)。更多步骤,但更快...

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