Sql MS Access一对多查询

Sql MS Access一对多查询,sql,ms-access,Sql,Ms Access,我正在处理一个服务类型数据库。客户可以有许多设备类型和许多服务电话。 我试图做一个查询,当满足与设备类型相关的某些参数时,选择客户名称、地址等 客户最多可拥有5种不同的设备类型。有的只有1个,有的全部有5个。 我的查询是试图找到安装了设备类型3但没有安装设备类型5的客户。“设备类型3”在我的搜索表单上还必须有“服务日期介于到日期”字段 当我写这个查询时,我是一片空白。我能够查询具有设备类型3和具体服务日期的客户,但我似乎无法排除安装了设备5的客户,即使他们也安装了设备类型3 这是我的SQL: S

我正在处理一个服务类型数据库。客户可以有许多设备类型和许多服务电话。 我试图做一个查询,当满足与设备类型相关的某些参数时,选择客户名称、地址等

客户最多可拥有5种不同的设备类型。有的只有1个,有的全部有5个。 我的查询是试图找到安装了设备类型3但没有安装设备类型5的客户。“设备类型3”在我的搜索表单上还必须有“服务日期介于到日期”字段

当我写这个查询时,我是一片空白。我能够查询具有设备类型3和具体服务日期的客户,但我似乎无法排除安装了设备5的客户,即使他们也安装了设备类型3

这是我的SQL:

SELECT 
tblCustomers.WCWF_ID, 
tblCustomers.CustBusiness, 
tblCustomers.CustLastName, 
tblCustomers.CustFirstName, 
tblCustomers.CustAddress, 
tblCustomers.CustCity, 
tblCustomers.CustST, 
tblCustomers.CustZip5, 
tblEquip.EquipResinDate, 
tblEquip.EquipType, 
tblCustomers.CustPostCard
FROM 
tblCustomers 
INNER JOIN 
tblEquip ON tblCustomers.WCWF_ID = tblEquip.WCWF_ID
WHERE 
(((tblEquip.EquipResinDate) Between [forms]![MailSearchSelect]![StartDate]   And [forms]![MailSearchSelect]![EndDate]) 
AND ((tblEquip.EquipType)=3 
AND (tblEquip.EquipType)<>5) 
AND ((tblCustomers.CustPostCard)=True));
选择
tblCustomers.WCWF_ID,
TBL客户。客户业务,
tblCustomers.CustLastName,
tblCustomers.CustFirstName,
tblCustomers.CustAddress,
tblCustomers.custscity,
tblCustomers.cusst,
tblCustomers.CustZip5,
tblEquip.equiresinade,
tblEquip.equip类型,
tblCustomers.cust明信片
从…起
TBL客户
内连接
tblCustomers.WCWF_ID=tblEquip.WCWF_ID上的tblEquip
哪里
(((tblEquip.equired)介于[forms]![MailSearchSelect]![StartDate]和[forms]![MailSearchSelect]![EndDate]之间)
和((tblEquip.EquipType)=3
和(tblEquip.设备类型)5)
和((tblCustomers.custposcard)=True);

任何帮助都将不胜感激。

您的查询的问题是,您将使用单一连接来筛选设备类型为3的客户和筛选设备类型为5的客户:您需要将该逻辑划分为两个不同的部分

要吸引安装了设备类型3的客户,使用联接是可以的(为了更清楚,我刚刚将相关条件从WHERE子句移动到联接)。还可以将此需求表示为具有相关子查询的WHERE-EXISTS条件

要排除已安装设备类型5的客户,您可以:

  • 将WHERE子句中的NOT EXISTS条件与相关子查询一起使用(我选择了该选项)
  • 或者使用左连接,其中。。。是空的
查询:

SELECT
    c.WCWF_ID, 
    c.CustBusiness, 
    c.CustLastName, 
    c.CustFirstName, 
    c.CustAddress, 
    c.CustCity, 
    c.CustST, 
    c.CustZip5, 
    e.EquipResinDate, 
    c.EquipType, 
    c.CustPostCard
FROM
    tblCustomers AS c
    INNER JOIN tblEquip AS e
        ON e.WCWF_ID = c.WCWF_ID
        AND e.EquipType = 3
        AND e.EquipResinDate 
            BETWEEN [forms]![MailSearchSelect]![StartDate] 
            AND [forms]![MailSearchSelect]![EndDate]) 
WHERE
    c.CustPostCard = True
    AND NOT EXISTS (
        SELECT 1
        FROM tblEquip AS e2
        WHERE 
            e2.WCWF_ID = c.WCWF_ID
            AND e2.EquipType = 5
    )

PS:给表名指定别名也是一个好主意;它使查询更具可读性,并且可以避免在查询中多次引用同一个表时由于名称冲突而导致的细微错误。

我遇到MS Access错误:不支持联接表达式。@Rick:我想我在表别名中缺少AS关键字,请再试一次好吗?我想我找到了。SELECT语句中有一个输入错误。我把它修好了,它似乎在工作!谢谢GMB!在没有AS的情况下似乎可以工作,但在不存在的情况下缺少了S。而c.equipresinade应该是e.equipresinade。