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

时间:2017-01-28 11:36:10

标签: sql ms-access join sql-delete

我正在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 ║
    ╚═══════╧══════╝

谢谢!

2 个答案:

答案 0 :(得分:0)

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

选择查询运行查询,并验证结果。

答案 1 :(得分:0)

好的,多亏了这些建议,我想我已经找到了解决方案。 似乎第一个&#34; DELETE&#34;工作正常,因为在&#34; JOIN&#34;声明只有&#34; =&#34;比较。在第二个SQL中,我离开了&#34; =&#34;在&#34; JOIN&#34;内的陈述,而我已经移动了&#34;&lt;&gt;&#34; &#34; WHERE&#34;:

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

感谢。