在Access数据库中打开表单时的SQL查询

时间:2017-02-23 08:42:28

标签: sql ms-access

我正在开发我正在开发的访问数据库中的表单时遇到问题。查询正在运行而没有停止。我必须手动停止它(因此不执行下面描述的操作)。 在开头,表单应该执行这部分代码:

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。 我希望它足够清楚......

谢谢, 戴安

2 个答案:

答案 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