从特定类别

时间:2018-04-03 18:14:26

标签: sql vba ms-access access-vba ms-access-2016

我有一个包含多个修复类别的表,以及与每个修复类别相关联的项目。我试图将特定修复类别中尚未存在的所有标准项插入到详细信息表中。

TblEstimateDetails是Estimate Table和StandardItem Table的连接表。 TblCategoryItems是修复类别及其各自标准项的连接表。

例如,在附加图像中,左侧是修复类别中的所有标准项目,右侧是已在EstimateDetails表中的所有标准项目。

Standard Items All vs Already Included

我需要能够从左侧插入6个缺失的GUID,并插入右侧的表中,并且仅针对特定的估计GID。

这是在Access VBA脚本中使用的,一旦我获得正确的sql语法,我将转换为相应的代码。

谢谢!

INSERT INTO TblEstimateDetails(estimate_GID, standard_item_GID)
SELECT 
 '55DEEE29-7B79-4830-909C-E59E831F4297' AS estimate_GID
 , standard_item_GID 
FROM TblCategoryItems 
WHERE repair_category_GID = '32A8AE6D-A512-4868-8E1A-EF0357AB100E'
AND NOT EXISTS 
  (SELECT standard_item_GID
  FROM TblEstimateDetails 
  WHERE estimate_GID = '55DEEE29-7B79-4830-909C-E59E831F4297');

2 个答案:

答案 0 :(得分:0)

要尝试的一些事项:1)简化为选择查询以查看它是否选择了正确的记录,2)使用NOT IN语句而不是NOT EXISTS。没有理由不存在不适用的工作,如果它不起作用,我会尝试不同的方式。

SELECT '55DEEE29-7B79-4830-909C-E59E831F4297' AS estimate_GID, 
standard_item_GID 
FROM TblCategoryItems 
WHERE repair_category_GID = '32A8AE6D-A512-4868-8E1A-EF0357AB100E'
AND standard_item_GID NOT IN 
(SELECT standard_item_GID FROM TblEstimateDetails 
WHERE estimate_GID = '55DEEE29-7B79-4830-909C-E59E831F4297');

答案 1 :(得分:0)

弄清楚了。 Access需要将子查询与主查询相关联才能工作。所以我将子查询中的WHERE子句设置为等于主查询中的匹配列。我必须加入Estimates表,以便它只选择特定估计中的项目。

SELECT 
 '06A2E0A9-9AE5-4073-A856-1CCE6D9C48BB' AS estimate_GID
 , CI.standard_item_GID 
FROM TblCategoryItems CI 
INNER JOIN TblEstimates E ON CI.repair_category_GID=E.repair_category_GID
WHERE E.repair_category_GID = '15238097-305E-4456-B86F-3787C9B8219B' 
AND NOT EXISTS 
  (SELECT ED.standard_item_GID 
  FROM TblEstimateDetails ED 
  WHERE E.estimate_GID=ED.estimate_GID
);