Microsoft Access查询返回问题

时间:2019-06-21 07:12:25

标签: sql ms-access

我已经建立了一个Access数据库,以跟踪足球和篮球俱乐部的每月付款。该数据库包括一个Clients表和一个Payments表。

每条付款记录都链接到特定的客户。每个月由客户付款。我创建了一个查询以返回所有每月付款的人。

要让我的查询返回这些尚未付款的客户,我输入要搜索的月份,如果他们没有与之匹配的记录,则它们将被包括在列表中。

第二个付款月我遇到了问题。例如,如果我输入"June"作为搜索月份,则记录为"May"的人会显示在列表中,即使他们已经为"June"付费了也是

我尝试寻找不同的方法来过滤表,但是不确定如何以不会出现这些不需要的值的方式来过滤表,也不知道是否可能。我还意识到,如果我每月更新表时删除旧数据,则可以解决此问题,但是我想跟踪谁每月付款,而不必删除记录。我不确定要怎么做,因此我没有添加任何其他代码来尝试缓解此问题。

SELECT Clients.[Player ID], Clients.[Player Name], Clients.[Contact Number], Payment.[Payment Amount], Payment.[Payment Month]
FROM Clients INNER JOIN Payment ON Clients.[Player ID] = Payment. [Player ID]
WHERE (((Payment.[Payment Month]) Not Like [Enter the month:])) OR (((Payment.[Payment Month]) Is Null));

重申一下,如果某人在特定月份没有付款,我希望在输入"June"时显示某人的名字。我不希望他们的名字显示出来,如果他们已经为"June"付款,但也不想显示"May",因为查询结果中显示了"May"的记录。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

要从您的查询中获取适当的结果,我建议通过以下方式将子查询与left join结合使用:

select
    clients.[player id], 
    clients.[player name], 
    clients.[contact number]
from
    clients left join 
    (
        select payment.[player id] 
        from payment
        where payment.[payment month] = [Enter the month:]
    ) payments
    on clients.[player id] = payments.[player id]
where
    payments.[player id] is null

或者,您可以使用相关的子查询,例如:

select
    clients.[player id], 
    clients.[player name], 
    clients.[contact number]
from
    clients
where not exists 
(
    select 1 from payment 
    where 
    clients.[player id] = payment.[player id] and 
    payment.[payment month] = [Enter the month:]
)

在这里,由于我怀疑您不太可能希望使用通配符来匹配多个月份名称,因此我使用了等于运算符(=来代替like运算符。

但是,正如@Gustav正确指出的那样-除非您还包含一个字段来存储付款年份和付款月份,否则这两个字段都将包含多年的结果。

我还建议将月份存储为整数值(而不是字符串),以便可以更有效地为索引编制索引;然后,如果您希望在查询中显示月份名称或作为参数显示,请使用单独的Months表或使用MonthName函数。

或者,使用日期字段存储付款日期,然后使用YearMonth函数或选择条件中的日期范围。