为什么MS Access Append(INSERT INTO)查询中的DataType Number递增?

时间:2018-08-14 22:44:51

标签: sql ms-access insert-into

我在使用MS Access时遇到了令人困惑的小故障。当我在数据类型为Number的表上运行追加查询时,不是将查询的值分配给单元格,而是将查询的值增加了数字。这是我的代码。

INSERT INTO Billing ( BillDate, BillAmount, NumActive )
SELECT #8/14/2018# AS Expr1, 100 AS Expr2, Sum(IIf([Members].[Active]=Yes,1,0)) AS Expr3
FROM Members, Billing;

基本上,我计算的是某个时期内的活跃成员的数量(目前恰好是34个成员),因此我可以平均分配帐单。但是,当我从空的Billing表开始运行查询时,每次都会得到以下结果:

  • 运行1:Billing.NumActive = Null
  • 运行2:Billing.NumActive = 34
  • 运行3:Billing.NumActive = 68
  • 运行4:Billing.NumActive = 102

Snapshot of my Billing table after 4 queries

由于活动成员的数量没有变化,我希望每次都能插入34个。任何想法为什么它可能会这样工作?

BillingID是一个自动编号,并且“ PerPerson”列已计算。现在,我正在对日期和金额进行硬编码,但最终两者都将通过表格填充。

3 个答案:

答案 0 :(得分:3)

您的查询正在计算活动成员的数量x倍,其中x是Billing表中的记录数量。发生这种情况是因为您的查询“交叉连接”了MembersBilling表(创建了两个表的记录的所有可能组合)。为避免这种情况,请从查询的Billing子句中删除FROM表:

INSERT INTO Billing ( BillDate, BillAmount, NumActive )
SELECT #8/14/2018# AS Expr1, 100 AS Expr2, Sum(IIf([Members].[Active]=Yes,1,0)) AS Expr3
FROM Members;

答案 1 :(得分:1)

您要INSERT单行。 INSERT ... VALUES表格对我来说更有意义。

INSERT INTO Billing ( BillDate, BillAmount, NumActive )
VALUES (#8/14/2018#, 100, DCount('*', 'Members', '[Active]=Yes'))

如果与之相关的问题是查询设计器将其转换为INSERT ... SELECT形式,则无需使用FROM即可完成此操作,因为您不想添加两个{{1} }或Members,并且肯定没有这两个表的笛卡尔积中的行那么多。

Billing

如果出于任何原因如果没有INSERT INTO Billing ( BillDate, BillAmount, NumActive ) SELECT #8/14/2018# AS Expr1, 100 AS Expr2, DCount('*', 'Members', '[Active]=Yes') AS Expr3; 都无法摆脱,请使用仅返回一行的表或查询。我使用一个自定义表Dual,该表可以保证只包含一行。

FROM

答案 2 :(得分:0)

作为使用DCount的替代方法,您可以使用标准的SQL COUNT函数:

INSERT INTO Billing ( BillDate, BillAmount, NumActive )
SELECT #8/14/2018# AS Expr1, 100 AS Expr2, COUNT(*) AS Expr3
FROM Members
WHERE Active = Yes;

因为没有GROUP BY子句的SQL语句和COUNT函数将仅返回一行。