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));

任何帮助将不胜感激。

专线小巴

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

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

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

  • 在WHERE子句中使用NOT EXISTS条件和相关子查询(我选择了该选项)
  • 或在WHERE ... IS NULL中使用LEFT JOIN。

查询:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章