【发布时间】: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 它可以工作。
标签: sql ms-access join sql-delete