查询多对多关系的“不在”连接表

时间:2018-10-30 21:10:44

标签: ms-access

我在PC和软件许可之间有多对多关系,在第三张表Installs中表示。

+--------------------+
|       tblPCs       |
+--------------------+
| PCID (primary key) |
| ITTag              |
| other useful info  |
+--------------------+

+-----------------------------------+
|              tblLic               |
+-----------------------------------+
| SWLicID (primary key)             |
| SWType (foreign key of tblSWType) |
| other useful info                 |
+-----------------------------------+

+-------------------------+
|       tblInstall        |
+-------------------------+
| InstallID (primary key) |
| PCID                    |
| SWLicID                 |
+-------------------------+

+-------------------+
|     tblSWType     |
+-------------------+
| SWTypeID          |
| SWName            |
| other useful info |
+-------------------+

我需要一个查询,该查询返回所有未安装ITTag的PC中的SWType。与包含用户选择的OnClick的文本控件相比,我正在使用按钮的SWTypeID事件来运行SQL。

当前SQL返回所有PC,包括已安装指定SWType的任何许可证的PC。

SQL = "SELECT tblPCs.* " _
    & "FROM tblPCs " _
    & "WHERE tblPCs.PCID NOT IN " _
    & "(SELECT I.EqID FROM tblInstall as I, tblLic as L WHERE I.SWLicID = L.SWLicID AND L.SWTypeID = " & CLng(txtSelSW) & ")"

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

可能有很多方法可以完成此操作,但是假设我已正确理解,我建议在嵌套LEFT JOIN查询中使用SELECT

SELECT tblPCs.*
FROM
    tblPCs LEFT JOIN
    (
        SELECT tblInstall.PCID
        FROM tblInstall INNER JOIN tblLic ON tblInstall.SWLicID = tblLic.SWLicID
        WHERE tblLic.SWType = 123456
    ) t
    ON tblPCs.PCID = t.PCID
WHERE
    t.PCID IS NULL

根据需要更改tblLic.SWType的值。