在 VBA 中不存在的地方使用插入

Posted

技术标签:

【中文标题】在 VBA 中不存在的地方使用插入【英文标题】:Using insert into where not exists in VBA 【发布时间】:2015-02-19 10:57:03 【问题描述】:

我在 MS Access 中有一个可爱的表格和一张可爱的桌子(我保证)。我想在按下按钮时使用 where not exists 插入此表,但我收到一个不太友好的运行时错误 3067:“查询输入必须包含至少一个表或查询。”

我的查询已经完成了...

strSQL = "insert into tbl_MAP_systemTask (TaskID, SystemID) " & _
            " Values (" & taskID & ", " & sysID & _
            ")  where not exists " & _
            " (select M.TaskID, M.SystemID from tbl_MAP_systemTask as M where M.TaskID = " & taskID & _
            " and M.SystemID = " & sysID & ");"

Debug.Print strSQL
DoCmd.RunSQL (strSQL)

strSQL 现在是

insert into tbl_MAP_systemTask (TaskID, SystemID)  
Values (1, 1)  
where not exists  
(select M.TaskID, M.SystemID 
from tbl_MAP_systemTask as M where M.TaskID = 1 and M.SystemID = 1);

谁能解释一下 a) 我弄坏了什么? b) 如何解决?

【问题讨论】:

【参考方案1】:

您可以使用域函数来代替使用子查询,

If Dcount("*", "tbl_MAP_systemTask", "TaskID = " & taskID & " AND SystemID = " &sysID) = 0 Then
    strSQL = "INSERT INTO tbl_MAP_systemTask (TaskID, SystemID) " & _
             " VALUES (" & taskID & ", " & sysID & ")
    CurrentDb.Execute strSQL
Else
    MsgBox "The Data already exists in the table, so nothing was added."
End If

【讨论】:

好吧,这个工作做得很好。你是一个绅士和一个学者! 很高兴听到这个消息。祝你好运:)【参考方案2】:

试试这个:

strSQL = "insert tbl_MAP_systemTask (TaskID, SystemID) " & _
            " select " & taskID & ", " & sysID & _
            " where not exists " & _
            " (select M.TaskID, M.SystemID from tbl_MAP_systemTask as M where M.TaskID = " & taskID & _
            " and M.SystemID = " & sysID & ");"

=>

insert tbl_MAP_systemTask (TaskID, SystemID)  
select 1, 1
where not exists  
(select M.TaskID, M.SystemID 
from tbl_MAP_systemTask as M where M.TaskID = 1 and M.SystemID = 1);

并且在我的情况下似乎有效。似乎where not exists 需要一个 select 语句,因此您必须像这样对插入进行建模。

【讨论】:

【参考方案3】:

也许您可以使用记录集来插入这些值。

Dim rs as Recordset
Set rs = Currentdb.openRecordset("SELECT * FROM tbl_MAP_systemTask WHERE TaskID=" & Me.TaskID & " AND SystemID=" & Me.SystemID)

if not (rs.eof or rs.bof) then
 rs.addnew
 rs.TaskID = Me.TaskID
 rs.SystemID = Me.SystemID
 rs.update
end if

rs.close
set rs = nothing

【讨论】:

不,这个抛出了一整套不受支持的方法错误。【参考方案4】:

TOP 1 子句必须在主查询中。

INSERT INTO tbl_MAP_systemTask (TaskID, SystemID)
SELECT TOP 1 1 AS TaskID 1 AS SystemID
FROM tbl_MAP_systemTask
WHERE NOT EXISTS (SELECT TOP 1 TaskID,SystemID FROM 
tbl_MAP_systemTask WHERE TaskID = 1 and SystemID=1);

如果tbl_MAP_systemTask表为空或表中只有一条记录,则子查询中必须省略TOP 1子句。 出于性能目的,我已将 Top 1 子句作为子查询。

【讨论】:

以上是关于在 VBA 中不存在的地方使用插入的主要内容,如果未能解决你的问题,请参考以下文章

删除 VBA 中不存在的工作表

在不存在但线程安全的地方插入(我不想重复)

如果列中不存在,则使用 Laravel eloquent 插入数据

如果记录已经存在或者在 PDO MySQL 插入查询中不存在,如何生成 javascript 警报?

如果访问中不存在则插入

如果存在,如何更新文档,如果在 mongodb 中不存在,如何将其插入?