也许这比它需要的更复杂,或者它可能更简单。无论哪种方式,它一直让我疯狂,我真的很感激任何帮助。
我尝试过搜索谷歌和堆栈溢出,以及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已经软弱了我。
谢谢!
答案 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];
...产生完全相同的结果。