MS Access SQL 插入不存在记录的 table

MS Access SQL Insert Into table where records do not exist

我正在为我的工作构建一个 Access 数据库,但我对如何执行 INSERT INTO SQL 查询有点困惑。我有一个 table (tblTempData),其中包含从 Excel 导入的数据。其中 2 列分别包含病房和顾问的姓名。通过将它们的名称与我的 tblWard 和 tblConsultant tables.

中存储的名称进行比较,我已将它们转换为正确的 WardID 和 ConsultantID

在我的工作中,一个病房可以有很多顾问,一个顾问可以在多个病房工作,所以我制作了一个名为 tblWardConsultant 的桥 table,它有一个主键以及 WardID 和 ConsultantID 的外键。我现在需要将 tblTempData 中的记录与 tblWardConsultant 进行比较,并将当前不存在的任何 ward/consultant 组合添加到 tblWardConsultant。

例如

 tblWard:  WardID: 1, WardName: Ward X
           WardID: 2, WardName: Ward Y

 tblConsultant: ConsultantID: 1, ConsultantName: Person A
                ConsultantID: 2, ConsultantName: Person B

A 可以在病房 X 和 Y 工作,B 可以在病房 X 工作,他们在下面的桥 table:

 tblWardConsultant: WardConsultantID: 1, WardID: 1, ConsultantID: 1
                    WardConsultantID: 2, WardID: 2, ConsultantID: 1
                    WardConsultantID: 3, WardID: 1, ConsultantID: 2

如果在我的 tblTempData 中,我发现 B 也在病房 Y 工作,我需要将 WardID 和 ConsultantID 作为新记录添加到 tblWardConsultant 中:

 tblWardConsultant: WardConsultantID: 4, WardID: 2, ConsultantID: 2

所以问题是如何做到这一点!我试图使用下面的代码只使查询的 select 部分成为查询的一部分,但是这个 returns 所有 ward/consultant 组合无论它们是否在 tblWardConsultant table 中。将其更改为 WHERE EXISTS returns 没有结果:

SELECT tblTempData.WardID, tblTempData.ConsultantID
FROM tblTempData
WHERE NOT EXISTS (
SELECT tblWardConsultant.WardID, tblWardConsultant.ConsultantID
FROM tblWardConsultant)
AND tblTempData.WardID IS NOT NULL
AND tblTempData.ConsultantID IS NOT NULL;

你需要一个相关的子查询,比如:

SELECT DISTINCT td.WardID, td.ConsultantID
FROM tblTempData as td
WHERE NOT EXISTS (SELECT twc.WardID, twc.ConsultantID
                  FROM tblWardConsultant as twc
                  WHERE twc.WardId = td.WardId AND twc.ConsultantId = tw.ConsultantId
                 ) AND 
      td.WardID IS NOT NULL AND
      td.ConsultantID IS NOT NULL;

作为替代方案,考虑使用 LEFT JOIN...IS NULL 查询(避免子查询,如果不是性能的话,可读性可能更好):

SELECT tblWardConsultant.WardID, tblWardConsultant.ConsultantID 
FROM tblWardConsultant 
LEFT JOIN tblTempData
       ON tblWardConsultant.WardID = tblTempData.WardID 
      AND tblWardConsultant.ConsultantID = tblTempData.ConsultantID
WHERE tblWardConsultant.WardID IS NULL
AND tblWardConsultant.ConsultantID IS NULL;