MS Access一对多查询

时间:2019-01-28 19:18:38

标签: sql ms-access

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

一个客户最多可以拥有5种不同的设备类型。有些只有1,有些只有5。 我的查询正在尝试查找安装了设备类型3而不是设备类型5的客户。设备类型3还必须在我的搜索表单上的date字段之间具有服务日期。

在编写此查询时,我正在空白。我可以使用设备类型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));

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

查询的问题是,您想使用单个JOIN来过滤设备类型为3的客户并过滤出设备类型为5的客户:您需要将该逻辑分为两个不同的部分。

要退出安装了3类设备的客户,可以使用JOIN(为了更清楚起见,我将相关条件从WHERE子句移至JOIN)。也可以将这一要求表达为带有相关子查询的WHERE EXISTS条件。

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

  • 在WHERE子句中使用NOT EXISTS条件以及相关的子查询(我选择了该选项)
  • 或将LEFT JOIN与WHERE ... IS NULL一起使用。

查询:

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:给表名起别名也是个好主意;这样可以使查询更具可读性,并且可以避免在查询中多次引用同一张表时因名称冲突而引起的细微错误。