0

也许这比它需要的更复杂,或者更简单。无论哪种方式,它一直让我发疯,我非常感谢任何帮助。

我试过搜索谷歌和堆栈溢出,以及没有成功的 Safari Book on Access,但也许我只是无法清楚地定义我想要找到它的内容。

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

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

我想要什么(这可能是我完全偏离基础的地方......我以前认为我可以在 mySQL 中做到这一点,但我对 Access 真的很陌生):

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

我认为需要

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 对我很软弱。

谢谢!

4

1 回答 1

1

关系数据库设计的核心概念之一是规范化,这是一个花哨的词,表示“不要在多个地方‘写下’同一条信息”。

认为您想将每个区域的“区域数量”存储在 [区域信息] 表中,但您已经在 [区域信息] 表中“记录”了该信息。你只需要一个方便的方法把它拉出来。

正如您所猜到的那样,聚合(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”,那么您可以像使用您构建的其他查询中的一样使用该查询,例如显示区域计数的查询,而不实际将计数存储在 [Zone Information] 表本身中。 ..

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];

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

于 2013-04-06T09:22:57.473 回答