我正在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"one_answers"OPaa",因此"CurreintINvalid"one_answers"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 ║
╚═══════╧══════╝
谢谢!
您正试图删除一条不唯一的记录,和/或您的一个联接正在聚合数据。
以选择查询的形式运行查询,然后验证结果。
好吧,多亏了这些建议,我想我已经找到了解决方案。第一个"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);
谢谢。