我希望有人可以帮助我:
我有一个简单的查询,将名称和基本详细信息列表与另一个包含更多特定信息的表相结合。有些名字必然会出现不止一次,“John Smith 1”和“John Smith 2”这样的任意区别都不是一个选项,所以我一直使用自动编号来保持记录的清晰。
问题是我的查询为每个出现多次的名称创建了两条记录。例如,有两个名为“Sophoan”的客户端,每个客户端具有不同的ID号,并且查询每次都拾取两次,从而产生四条记录(当应该只有102条记录时总共有122条记录)。 “唯一值”设置为“是”。
我尽可能多地研究并完全陷入困境。我试图修改sql但它总是带有错误,我认为是因为查询中有太多字段。
我错过了什么?或者查询是错误的方法,我需要找到另一种方法来组合我的表?
详细项目:我正在为慈善机构建立一个数据库,该数据库有两项主要活动:社会工作和培训。该数据库用于记录他们的客户信息以及他们与客户的互动结果(他们要求帮助的问题,培训研讨会的结果等)。一些客户端将在组织想要跟踪的活动之间进行交叉,因此所有注册的客户端都会进入一个列表,并且各个表格会旋转以收集客户端参与的每个特定活动的数据。此查询应该是我的解决方案将这些表组合起来,供用户输入数据。
目前我有以下表格:
查询:
但是我意识到查询不能用于数据输入,所以这种方法似乎是死路一条。我在使用子表单进行数据输入方面取得了一些成功,但我不确定它是否是最佳方式。
所以,我基本上希望实现的是同时向两个表输入相同数据(对于新记录)并将结果记录匹配在一起的方法(对于现有记录的新条目)。但是同一个名称可能不止一次出现作为一个独特的记录(例如三个人名为约翰史密斯)。
[N.B。有更多的表存储辅助信息,但与问题无关,因为它们不存在,也不会链接到任何其他表。]
答案 0 :(得分:1)
我意识到查询不能用于数据输入
实际上,非复杂查询 通常是可编辑的,只要您想要编辑其数据的表格保留在核心位置即可。的查询。 Access使用许多因素来确定查询是否可编辑 大多数情况下,很容易弄清楚查询为什么变得不可编辑 问自己一个问题:如果我编辑这些数据,Access将如何确保准确地更新数据,而不会产生歧义?
如果您的表已定义主键并且这些是查询的一部分,并且如果没有分组,计算字段(使用某些函数来更改或测试该字段的值的字段)或复杂连接,则查询应保持可编辑状态 你可以在这里阅读更多相关内容:
因此,我基本上希望实现的是同时向两个表(对于新记录)输入相同数据并将结果记录匹配在一起(对于现有记录的新条目)的方法。但是同一个名称可能不止一次出现作为一个独特的记录(例如三个人名为约翰史密斯)。
这句话实际证明您的数据库存在设计问题。
数据库设计的基本原则是尽可能地消除冗余。其中一个原因实际上是避免在多个地方更新相同的数据。
另一个评论:您使用客户端的名称作为自然密钥。坦率地说,它是不一个非常好的主意。通常,您希望确保表格的主键构成的内容随着时间的推移是唯一可靠的。
使用人名通常是错误的选择,因为:
在表中强制记录唯一性的最佳方法是在创建新表时使用Access提出的默认 AutoNumber ID
字段。这称为代理键
它并不意味着要编辑,更改甚至显示给用户。它的唯一目的是允许表的主键是唯一的并且不随时间变化,因此它可以可靠地用作从一个表到另一个表引用记录的方法(如果表需要引用特定记录,它将包含一个将保存ID
的字段。该字段称为外键)。
您对表的名称不够精确:将每个表视为实体保存相关数据。
你有一个名为AllList
的表的事实意味着它的目的不是那么好想的;这听起来像是一个全能而不是精心设计的实体
相反,如果这是您的客户列表,则只需将其称为Client
。该表的每条记录都包含单个客户的信息(无论是使用复数还是单数都取决于您,只是坚持您的选择,但保持一致非常重要。)
不要使用客户端的名称作为密钥,而是创建ID
字段,自动编号,并将其设置为主键。
让我们重命名"社会工作注册",其中包含客户的案例,简称为ClientCase
。从你对表格的描述中可以清楚地看出这种关系,但是表格名称本身并不清楚(顺便说一下,我知道Access允许表格和字段名称中的空格,但使用它真的很糟糕)如果你至少关心你工作的未来,那就可以了。)
在此中,创建一个ClientID
号码字段(外键),该字段将保存ID
表中相关客户的ClientCase
。
您不会谈论客户与其案例之间的关系。这是您必须明确的另一个领域:单个客户可以拥有多少个案例?
了解这一点对于在查询中选择正确类型的JOIN
非常重要。在构建数据库时,它是设计假设的关键部分。
例如,在最一般的情况下,假设客户可能有0个或更多个案,您可以有一个报告显示客户的名称以及与他们相关的案例数量如下:
SELECT Client.Name,
Count(ClientCase.ID) AS CountOfCases
FROM Client
LEFT JOIN ClientCase
ON Client.ID = ClienCase.ClientID
GROUP BY Client.Name
您已经更多地描述了您的基本设计,但这还不够。向我们展示您尝试的实际表结构和SQL查询。从您提供的描述中,很难真正理解设计的实际细节,并告诉您它失败的原因以及如何使其发挥作用。