我已经建立了一个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"
的记录。任何帮助将不胜感激。
答案 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函数。