如何使用添加查询添加表中尚不存在的记录
Posted
技术标签:
【中文标题】如何使用添加查询添加表中尚不存在的记录【英文标题】:How do I add records which do not already exists in a table with an add query 【发布时间】:2021-12-08 14:00:26 【问题描述】:我希望下面的添加查询只添加表中不存在的记录。
INSERT INTO tbl_TRUCK_train_cv ( handling, [text] )
SELECT qryTRUCK_CV_train_CW_2.cv_2 AS handling, "TRUCK: " & [tblTRUCKInformation].[fldTextTXT] & Chr(10) & Chr(13) & "train: " & [tbltrainInformation].[fldTextTXT] AS [text]
FROM (qryTRUCK_CV_train_CW_2 LEFT JOIN tbltrainInformation ON qryTRUCK_CV_train_CW_2.cw = tbltrainInformation.fldID) LEFT JOIN tblTRUCKInformation ON qryTRUCK_CV_train_CW_2.cv = tblTRUCKInformation.fldID
WHERE (((qryTRUCK_CV_train_CW_2.cv)<>""));
例如
表tbl_TRUCK_train_cv
中的数据如下:
id | handling | text
-------------------------
"" | "CV1/CW1" | "bla"
"" | "CV4/CW7" | "bla"
add查询中的数据如下:
id | handling | text
-------------------------
"" | "CV3/CW12" | "bla"
"" | "CV4/CW7" | "bla"
添加查询应该只添加"" | "CV3/CW12" | "bla"
,因为该记录不在表tbl_TRUCK_train_cv
中
我不知道如何解决这个问题。 在这种特殊情况下,该表由可能具有重复值的不同查询填充。
【问题讨论】:
向定义目标表中记录唯一性的字段添加唯一索引 (tbl_TRUCK_train_cv
)。
将Indexed
设置为Yes (No Duplicates)
会导致查询出错。或者我可能误解了你的建议
如果你从代码中运行它。尝试拨打DoCmd.SetWarnings = False
。或者使用查询作为源,在该查询中包含目标表的外连接,并根据其 ID 过滤为 Null。
什么是数据中的“重复”值 - 哪些字段决定了记录的唯一性?编辑问题以将示例数据和所需结果显示为文本表。
您可以使用 vba 解决此问题。根据添加查询循环遍历记录集。对于每一行,检查它是否在 tbl_Truck_train_cv 中,如果没有则插入。
【参考方案1】:
好的,这可以在类似于您在问题中制作的插入查询中完成。让我一步一步地引导你:
首先,让我们从连接表和字段“[处理]”的查询开始,它看起来像这样:
SELECT qryTRUCK_CV_train_CW_2.handling
FROM qryTRUCK_CV_train_CW_2 INNER JOIN
tbl_TRUCK_train_cv ON qryTRUCK_CV_train_CW_2.handling = tbl_TRUCK_train_cv.handling;
现在,您需要一个查询来查找查询 [qryTRUCK_CV_train_CW_2] 中不在表 [tbl_TRUCK_train_cv] 中的记录。为此,请将 Join 语句更改为 LEFT JOIN。这将显示查询 [qryTRUCK_CV_train_CW_2] 中的所有记录,无论表 [tbl_TRUCK_train_cv] 中是否有匹配记录。
SELECT qryTRUCK_CV_train_CW_2.handling
FROM qryTRUCK_CV_train_CW_2
LEFT JOIN tbl_TRUCK_train_cv ON qryTRUCK_CV_train_CW_2.handling =
tbl_TRUCK_train_cv.handling;
最后,添加条件 WHERE [tbl_TRUCK_train_cv].handling Is Null。
SELECT qryTRUCK_CV_train_CW_2.handling
FROM qryTRUCK_CV_train_CW_2 LEFT JOIN tbl_TRUCK_train_cv ON
qryTRUCK_CV_train_CW_2.handling = tbl_TRUCK_train_cv.handling
WHERE (((tbl_TRUCK_train_cv.handling) Is Null));
此 WHERE 子句会将记录限制为仅在 Query 中但不在表中的记录!
你快到了。
接下来,让我们将此作为分组查询,以防查询中的 [处理] 字段中存在重复项。
SELECT qryTRUCK_CV_train_CW_2.handling
FROM qryTRUCK_CV_train_CW_2 LEFT JOIN tbl_TRUCK_train_cv ON
qryTRUCK_CV_train_CW_2.handling = tbl_TRUCK_train_cv.handling
WHERE (((tbl_TRUCK_train_cv.handling) Is Null))
GROUP BY qryTRUCK_CV_train_CW_2.handling;
最后,将这些结果插入到表中 [tbl_TRUCK_train_cv]
INSERT INTO tbl_TRUCK_train_cv ( handling )
SELECT qryTRUCK_CV_train_CW_2.handling
FROM qryTRUCK_CV_train_CW_2 LEFT JOIN tbl_TRUCK_train_cv ON
qryTRUCK_CV_train_CW_2.handling = tbl_TRUCK_train_cv.handling
WHERE (((tbl_TRUCK_train_cv.handling) Is Null))
GROUP BY qryTRUCK_CV_train_CW_2.handling;
【讨论】:
谢谢 MKingham,我希望有一个不那么繁琐的解决方案,但它确实有效!以上是关于如何使用添加查询添加表中尚不存在的记录的主要内容,如果未能解决你的问题,请参考以下文章