【问题标题】:SQL VBA - Delete from where not existSQL VBA - 从不存在的地方删除
【发布时间】:2021-10-11 18:45:20
【问题描述】:

我有一个 Access 数据库,我尝试使用 Excel 工作簿中的 VBA 使用 SQL 命令插入、更新和删除该数据库。我的更新和插入命令工作正常,但我的删除命令冻结 Excel。我尝试过各种方法,有无表别名。

    Set dbConnection = CreateObject("ADODB.Connection") 'New ADODB.Connection
    dbConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=C:\Users\me\Desktop\Opstats Import\TG_DB.accdb;"
    
    Set dbCommand = CreateObject("ADODB.Command") 'New ADODB.Command
    
L = "[Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=" & ThisWorkbook.FullName & "].[LImport$]"
    
    With dbCommand
        .ActiveConnection = dbConnection
        
        'Update Labour

        SQL = "UPDATE tblLabour A" & _
              " INNER JOIN " & L & " X" & _
              " ON A.PositionID = X.PositionID AND A.Date = X.Date AND A.PayCode = X.PayCode" & _
              " SET A.Hours = X.Hours, A.Dollars = X.Dollars"
        .CommandText = SQL
        .Execute

        SQL = "DELETE FROM tblLabour" & _
              " WHERE NOT EXISTS (SELECT * FROM " & L & " X WHERE X.PositionID = tblLabour.PositionID AND X.Date = tblLabour.Date AND X.PayCode = tblLabour.PayCode)"
        .CommandText = SQL
        .Execute

        'Insert Labour

        SQL = "INSERT INTO tblLabour" & _
              " SELECT * FROM " & L & " X" & _
              " WHERE NOT EXISTS (SELECT PositionID, Date, PayCode FROM tblLabour A WHERE A.PositionID = X.PositionID AND A.Date = X.Date AND A.PayCode = X.PayCode)"
        .CommandText = SQL
        .Execute

    End With
    
    dbConnection.Close
    
    Set dbCommand = Nothing
    Set dbConnection = Nothing

我也试过了:

        SQL = "DELETE A FROM tblLabour A" & _
              " WHERE NOT EXISTS (SELECT * FROM " & L & " X WHERE X.PositionID = A.PositionID AND X.Date = A.Date AND X.PayCode = A.PayCode)"
        .CommandText = SQL
        .Execute

由于我的数据源,我没有主键,并且依赖三个字段来创建复合主键,因此查找记录的唯一方法是匹配所有三个字段。

我在 Access 查询中测试了 SQL,它似乎工作正常。

【问题讨论】:

    标签: sql excel vba ms-access


    【解决方案1】:

    尝试使用 NOT IN() 连接字段以用作唯一标识符。

    SQL = "DELETE FROM tblLabour" & _
           " WHERE NOT PositionID & PayCode & [Date] IN (SELECT PositionID & PayCode & [Date] FROM " & L & " X)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2021-09-16
      • 2020-11-28
      相关资源
      最近更新 更多