我在使用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表开始运行查询时,每次都会得到以下结果:
由于活动成员的数量没有变化,我希望每次都能插入34个。任何想法为什么它可能会这样工作?
BillingID是一个自动编号,并且“ PerPerson”列已计算。现在,我正在对日期和金额进行硬编码,但最终两者都将通过表格填充。
答案 0 :(得分:3)
您的查询正在计算活动成员的数量x倍,其中x是Billing
表中的记录数量。发生这种情况是因为您的查询“交叉连接”了Members
和Billing
表(创建了两个表的记录的所有可能组合)。为避免这种情况,请从查询的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
函数将仅返回一行。