我正在开发我正在开发的访问数据库中的表单时遇到问题。查询正在运行而没有停止。我必须手动停止它(因此不执行下面描述的操作)。 在开头,表单应该执行这部分代码:
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中检查哪些记录Field3 = 0,并且在这些记录中,哪些具有Field1匹配Table1的Field1和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 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。
答案 1 :(得分:0)
感谢您的帮助,我终于以不同的方式完成了这项工作,我不是程序员,所以也许它不是很干净但是它适用于我的目的: - )< / p>
首先我修改了一下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