Ms Access:使用 JOIN 和 NOT EQUAL 运算符的 DELETE 查询

Posted

技术标签:

【中文标题】Ms Access:使用 JOIN 和 NOT EQUAL 运算符的 DELETE 查询【英文标题】:Ms Access: DELETE query with JOIN and NOT EQUAL operator 【发布时间】:2017-01-28 11:36:09 【问题描述】:

我正在 MS Access 中编写一个简单的配置器。有两种规则,强制和无效。对于无效规则,我使用此 SQL,它工作正常:

DELETE DISTINCTROW RuntimeBOM.*
FROM CurrentInvalid
INNER JOIN RuntimeBOM ON ([RuntimeBOM].[OPTION] = [CurrentInvalid].[Invalid option])
AND ([RuntimeBOM].[FEATURE] = [CurrentInvalid].[Invalid feature])
WHERE RuntimeBOM.SessionID=fOSUserName();

强制规则我试过这个,但不影响表中的任何记录,确实返回运行时错误“3086”(无法从指定表中删除):

DELETE DISTINCTROW RuntimeBOM.*
FROM CurrentMandatory
INNER JOIN RuntimeBOM ON (RuntimeBOM.FEATURE = CurrentMandatory.MandatoryFeature)
AND (RuntimeBOM.OPTION <> CurrentMandatory.MandatoryOption)
WHERE RuntimeBOM.SessionID=fOSUserName();

fOSUserName() 是一个 vba 函数,用于获取运行应用程序的计算机的用户名。

╔══════════════╗   ╔══════════════════════════════════════════╗   ╔════════════════════════════════════════════╗
║  RuntimeBOM  ║   ║              CurrentInvalid              ║   ║              CurrentMandatory              ║
╟───────┬──────╢   ╟────┬──────┬───────────────┬──────────────╢   ╟────┬──────┬────────────────┬───────────────╢
║FEATURE│OPTION║   ║Feat│Option│Invalid feature│Invalid option║   ║Feat│Option│MandatoryFeature│MandatoryOption║
╠═══════╪══════╣   ╠════╪══════╪═══════════════╪══════════════╣   ╠════╪══════╪════════════════╪═══════════════╣
║FT001  │OP001 ║   ║FTaa│OPaa  │FT001          │OP001         ║   ║FTaa│OPaa  │FT002           │OP008          ║
║FT001  │OP002 ║   ║FTaa│OPaa  │FT001          │OP002         ║   ╚════╧══════╧════════════════╧═══════════════╝
║FT001  │OP003 ║   ║FTaa│OPaa  │FT001          │OP004         ║
║FT001  │OP004 ║   ║FTaa│OPaa  │FT001          │OP005         ║
║FT001  │OP005 ║   ╚════╧══════╧═══════════════╧══════════════╝
║FT002  │OP006 ║
║FT002  │OP007 ║
║FT002  │OP008 ║
║FT002  │OP009 ║
║FT002  │OP010 ║
╚═══════╧══════╝

在这种情况下,假设用户在某处选择了“FTaa”和“OPaa”,因此以这种方式填充“CurreintINvalid”和“CurrentMandatory”。无效规则的 SQL 删除 RuntimeBOM 中 FEATURE 等于 FT001 且 OPTION 等于“OP001”、“OP002”、“OP004”、“OP005”(如“CurrentInvalid”中定义)的记录。强制规则的 SQL 删除 RuntimeBOM 中 FEATURE 等于 FT002 且 OPTION 不等于“OP008”的所有记录(如“CurrentMandatory”中定义的那样)。 预期结果:

    ╔══════════════╗
    ║  RuntimeBOM  ║
    ╟───────┬──────╢
    ║FEATURE│OPTION║
    ╠═══════╪══════╣
    ║FT001  │OP003 ║
    ║FT002  │OP008 ║
    ╚═══════╧══════╝

谢谢!

【问题讨论】:

检查SELECT 版本的问题DELETE 查询。它是一个可更新的查询吗?这些连接的表或查询本身是 CurrentMandatory 吗? 感谢您的回答,它们是表,奇怪的是第一次删除工作正常。而第二个没有。如果将第二个查询转换为 SELECT 它可以工作。 【参考方案1】:

您正在尝试删除一条不唯一的记录,和/或您的一个联接正在聚合数据。

Select Query 的形式运行查询,并验证您的结果。

【讨论】:

感谢您的回答,我已从查询的 SELECT 版本开始进行调试。它非常有用。【参考方案2】:

好的,感谢您的建议,我想我已经找到了解决方案。 似乎第一个“DELETE”工作正常,因为在“JOIN”语句中只有“=”比较。在第二个 SQL 中,我将“=”语句留在了“JOIN”中,而将“”语句移到了“WHERE”中:

DELETE DISTINCTROW RuntimeBOM.*
FROM CurrentMandatory INNER JOIN RuntimeBOM ON (RuntimeBOM.FEATURE)=[CurrentMandatory].[MandatoryFeature]
WHERE RuntimeBOM.SessionID=fOSUserName() And ((RuntimeBOM.OPTION)<>CurrentMandatory.MandatoryOption);

谢谢。

【讨论】:

以上是关于Ms Access:使用 JOIN 和 NOT EQUAL 运算符的 DELETE 查询的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 2007 语法:From Join Join Join Where

MS Access INNER JOIN/LEFT JOIN 问题

MS Access SQL 多个 JOIN 和 WHERE 子句

MS-Access:SQL JOIN 和 INSERT INTO 与 WHERE 慢

MS Access 中的 SQL JOIN 问题

MS Access 2010 - 使用 RIGHT JOIN 的 SQL 查询 - 返回太多值