【问题标题】:MS Access SQL Deleting record based on external tableMS Access SQL删除基于外部表的记录
【发布时间】:2019-07-24 17:51:23
【问题描述】:

关于基于外部表(在未链接的表中)选择记录,我有一个类似的问题: Access SQL FROM IN and JOINS

这一次,我尝试根据外部表中的条件删除内部表中的记录。

Private Sub Command0_Click()
    Dim SQLstring As String
    SQLstring = "Delete * FROM Testtable1 AS tnf WHERE ([Network Location].[Testtable2].[Customers] = tnf.[Customers]) AND ([Network Location].[Testtable2].[Contract] = '2003') Or ([Network Location].[Testtable2].[Active]='N');"
    DoCmd.RunSQL (SQLstring)
End Sub

它告诉我" 不是一个有效的名称,并检查是否存在无效字符或标点符号或它是否太长。我找不到任何关于 SQL 长度的内容,但我很确定这不会太长。

我的 SQl 语句有什么遗漏吗?我一遍又一遍地检查它,但没有发现问题。

WHERE 子句应该有一个Exists (Select) 子句吗?

我错过了什么吗?

【问题讨论】:

    标签: sql vba ms-access sql-delete


    【解决方案1】:

    由于delete 查询一次只能从一个表中删除记录,因此from 子句中只能引用一个数据集。对于您当前的查询,您需要在 from 子句中引用 testtable2,这将导致无效的 delete 查询。

    因此,您需要将where exists 与子查询一起使用,例如:

    delete from testtable1 as t1
    where exists 
    (
        select 1 from [Network Location].[Testtable2] t2 
        where t2.customers = t1.customers and (t2.contract = '2003' or t2.active = 'N')
    )
    

    我还用括号括住了 or 表达式,因为我认为删除具有匹配 customers 记录和其他两个条件之一的记录是所需的逻辑,而不是删除 any t2.active = 'N' 的记录(因为 and 的运算符优先级高于 or)。

    【讨论】:

    • 只是在测试 Exists 子句。谢谢你添加这个。放置 Select 1Select [field] 之间有什么区别,因为 1 正常工作?
    • select 1 纯粹用于优化,因为我们只关心查询是否包含记录,我们对这些记录返回的数据不感兴趣。
    • 我不知道。我要把它写到我的备忘单上。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2018-04-12
    相关资源
    最近更新 更多