Sql MS access VBA-查询排除

Sql MS access VBA-查询排除,sql,vba,ms-access,Sql,Vba,Ms Access,我正在努力设置一个从表中排除某些值的查询。 为了更好地理解,数据库是在临床试验的背景下创建的,我希望通过一个组合框选择尚未参与某项研究的站点,而这些站点可能或可能尚未参与另一项研究 方法如下: tbl_站点-包含唯一的“站点ID”和“站点国家” tbl_研究-contanis是一个独特的“研究ID” tbl_init-每当站点参与研究时,都会生成一个条目,其中包含唯一的“init_ID”、相应的“site_ID”和“study_ID” 查询应选择“tbl_站点”中的所有站点,这些站点在“tbl_

我正在努力设置一个从表中排除某些值的查询。 为了更好地理解,数据库是在临床试验的背景下创建的,我希望通过一个组合框选择尚未参与某项研究的站点,而这些站点可能或可能尚未参与另一项研究

方法如下:

tbl_站点-包含唯一的“站点ID”和“站点国家”

tbl_研究-contanis是一个独特的“研究ID”

tbl_init-每当站点参与研究时,都会生成一个条目,其中包含唯一的“init_ID”、相应的“site_ID”和“study_ID”

查询应选择“tbl_站点”中的所有站点,这些站点在“tbl_ini”中没有与定义的“研究id”匹配的条目。我理解,我应该能够使用左连接来实现这一点

SELECT tbl_site.site_ID, tbl_site.site_country, tbl_init.study_ID
FROM tbl_site LEFT JOIN tbl_init ON tbl_site.site_ID = tbl_init.site_ID
WHERE (((tbl_init.study_ID) Not In ([Form]![frm_init]![study_ID]))) AND ((tbl_site.site_country)=[cbo_country]))
然而,排除值似乎只影响tbl_init中的第一个值。例如:如果我有两个美国网站和两个英国网站,那么所有英国网站和一个美国网站都已经是研究1的一部分。为研究1运行查询实际上会将参与站点从我们这里排除,但仍然会向我显示来自英国的所有站点(我猜这取决于源表中的初始排序)。 最后,我还需要添加“NOTNULL”以添加所有尚未参与任何研究的站点

编辑:下面是一个示例:

  • 我有“研究X”和“研究Y”,但尚未分配任何站点=>两个研究ID的查询显示tbl_站点中的所有站点(“A”-“E”)
  • 在将站点“A”、“B”和“C”添加到“研究X”之后,“研究X”的查询结果为“D”和“E”,这到目前为止还不错
  • 将站点“D”和“E”添加到“研究Y”后,“研究Y”的查询将显示站点“A”到“C”
  • 现在是棘手的部分

  • 我将已经参与“研究X”的站点“C”添加到“研究Y”。如果我现在查询“研究X”,“C”再次出现,因为tbl_init中有一个条目,其中研究ID与“C”匹配,但研究ID与“研究X”不相等,反之亦然

  • 如果我理解正确,您正在向查询传递两个参数,即国家和研究Id,并且您希望列出该国家中未参与给定研究Id的所有站点

    PARAMETERS [cbo_country] Text ( 255 ), [Forms]![frm_init]![study_ID] Text ( 255 );
    SELECT tbl_site.site_ID, tbl_site.site_country, tbl_init.study_ID
    FROM tbl_site LEFT JOIN tbl_init ON tbl_site.site_ID = tbl_init.site_ID
    WHERE (((tbl_site.site_country)=[cbo_country]) AND ((tbl_site.site_ID) Not In (SELECT tbl_init.site_ID FROM tbl_init WHERE (((tbl_init.study_ID)=[Forms]![frm_init]![study_ID])))));
    

    对这正是我努力实现的目标。问题是:通过这种方式,我得到的不是所有不参与给定研究的站点,而是所有参与其他研究的站点。由于一个站点可能会参与多个研究,因此,一旦该ID出现在多个条目中,站点也会参与另一个研究,或者说是在一般情况下,就不会再被排除在列表之外。工作起来很有魅力。非常感谢!