使用insert到VBA中不存在的位置

时间:2015-02-19 10:57:04

标签: sql vba ms-access

我有一个可爱的表格和MS访问的可爱表(我保证)。我想在按下按钮时使用不存在的地方插入此表但是我得到一个不太友好的运行时错误3067:"查询输入必须包含至少一个表或查询。 #34;

我的查询已经......

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)如何修复它?

4 个答案:

答案 0 :(得分:3)

不是使用SubQuery,而是使用Domain函数来实现这一目标,

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

答案 1 :(得分:0)

试试这个:

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语句,所以你必须像这样建模你的插件。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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子句是为了性能目的的子查询。