如何使用添加查询添加表中尚不存在的记录

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,我希望有一个不那么繁琐的解决方案,但它确实有效!

以上是关于如何使用添加查询添加表中尚不存在的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何为vagrant中尚不存在的用户安装目录

仅当复合主键尚不存在时,如何批量插入行? [AWS 红移]

SQL Server CE:如果存在更新,否则插入

尝试添加外键的 SQLAlchemy 错误

如何在 apache pig 中将列添加到已经存在的表中

SQL中,如何查询存在一个表的字段而不在另一个表的字段中的数据记录?