从查询更新一个访问表

时间:2013-04-05 23:31:21

标签: ms-access

也许这比它需要的更复杂,或者它可能更简单。无论哪种方式,它一直让我疯狂,我真的很感激任何帮助。

我尝试过搜索谷歌和堆栈溢出,以及Safari上的Safari Book没有成功,但也许我无法清楚地定义我想要的东西。

我正在Access中创建一个数据库。到目前为止,我有2个表: 地区信息 区域信息

区域信息有一个表格,其中包含一个“区域”列,其中包含2个字母的缩写,表示它所属的区域。 (例如:AA,GB,DT) 区域信息有一个表格,其中包含“缩写”和“区域数”

我想要的是什么(这里我可能完全偏离基础......我以为我之前可以在mySQL中做到这一点,但我对Access来说真的很新):

我希望能够随时向Zone添加新行,这将自动填充该区域中的“区域数”。

我认为需要

SELECT Count([Area Information].Zone) AS CountOfZone, [Area Information].Zone
FROM [Area Information]
GROUP BY [Area Information].Zone

从那里开始,

HAVING ((([Area Information].Zone)=[Zone Information].Abbreviation));

太糟糕了,这个不起作用。

最后,它需要更新该列中的正确行。

如果有人能帮助我澄清这一点,我将不胜感激。我一直在尝试我能想到的一切,而且我的google-fu已经软弱了我。

谢谢!

1 个答案:

答案 0 :(得分:1)

关系数据库设计的核心概念之一是规范化,这是一个花哨的词,用于说“不要在多个地方写下同一条信息”。< / p>

认为您希望在[区域信息]表中存储每个区域的“区域数量”,但您已在[区域信息]中“记下”该信息表。你需要一个方便的方法来解决它。

正如您所猜测的那样,聚合(GROUP BY)查询就是答案,像这样......

SELECT [Area Information].Zone, Count(*) AS [Number of Areas]
FROM [Area Information]
GROUP BY [Area Information].Zone;

...会产生这样的结果:

Zone    Number of Areas
----    ---------------
AB      3
BC      3
NS      1
ON      2

如果您将Access中的查询保存为“AreaCountsByZone”,那么您可以在构建的其他查询中使用查询,就像一样,例如显示的查询区域计数而不实际将计数存储在[区域信息]表本身 ...

SELECT [Zone Information].Abbreviation, [Zone Information].[Zone Name], 
    AreaCountsByZone.[Number of Areas]
FROM AreaCountsByZone INNER JOIN [Zone Information] 
    ON AreaCountsByZone.Zone = [Zone Information].Abbreviation;

...返回......

Abbreviation    Zone Name   Number of Areas
------------    ---------   ---------------
AB              Zone AB     3
BC              Zone BC     3
NS              Zone NS     1
ON              Zone ON     2

随着您对SQL越来越熟悉,您可能会发现跳过中间的“已保存查询”更方便,只需一次性完成整个过程:

SELECT [Zone Information].Abbreviation, [Zone Information].[Zone Name], 
    (SELECT Count(*) FROM [Area Information]
     WHERE [Area Information].Zone = [Zone Information].Abbreviation
    ) AS [Number of Areas]
FROM [Zone Information];

...产生完全相同的结果。