访问查询正在复制唯一记录/链接表问题

时间:2014-11-27 15:51:28

标签: ms-access ms-access-2010 duplicate-data

我希望有人可以帮助我:

我有一个简单的查询,将名称和基本详细信息列表与另一个包含更多特定信息的表相结合。有些名字必然会出现不止一次,“John Smith 1”和“John Smith 2”这样的任意区别都不是一个选项,所以我一直使用自动编号来保持记录的清晰。

问题是我的查询为每个出现多次的名称创建了两条记录。例如,有两个名为“Sophoan”的客户端,每个客户端具有不同的ID号,并且查询每次都拾取两次,从而产生四条记录(当应该只有102条记录时总共有122条记录)。 “唯一值”设置为“是”。

我尽可能多地研究并完全陷入困境。我试图修改sql但它总是带有错误,我认为是因为查询中有太多字段。

我错过了什么?或者查询是错误的方法,我需要找到另一种方法来组合我的表?

详细项目:我正在为慈善机构建立一个数据库,该数据库有两项主要活动:社会工作和培训。该数据库用于记录他们的客户信息以及他们与客户的互动结果(他们要求帮助的问题,培训研讨会的结果等)。一些客户端将在组织想要跟踪的活动之间进行交叉,因此所有注册的客户端都会进入一个列表,并且各个表格会旋转以收集客户端参与的每个特定活动的数据。此查询应该是我的解决方案将这些表组合起来,供用户输入数据。

目前我有以下表格:

  • AllList(客户名称和基本联系信息的主列表;'社会工作注册'和'参与者注册'通过以下方式加入此表 '名称')
  • 社会工作登记(社会工作客户名单,详细信息 每个案例)
  • 社会工作跟进表(员工致电社会工作客户时使用) 看看他们的问题是如何进展的;登记册太多了 列也可以保留;加入“客户名称”注册
  • 参与者注册(培训客户名单和详细信息 他们参加了哪些研讨会以及他们为什么缺席 错过了一个会议)
  • 个别研讨会表x14(每个研讨会包括一个测试和 这些表记录了客户的答案以及每个答案的得分 个人考试;届时将有超过20个 数据库完成;所有人都加入了“参与者注册” '参与者姓名')

查询:

  • 参与者概述查询(将来自“注册”的考勤数据与每个工作坊的评分数据相关联,以呈现为只读 概述;这个似乎工作得很好)
  • 社会工作查询(非功能性;旨在链接'客户 注册'到'AllList'进行数据输入,以便在新客户端时 注册后,它会在两个表格中创建一条新记录 记录匹配在一起)
  • 参与者查询(尚未尝试;如上所述,旨在链接 '参与者注册'到'AllList'进行数据输入)

但是我意识到查询不能用于数据输入,所以这种方法似乎是死路一条。我在使用子表单进行数据输入方面取得了一些成功,但我不确定它是否是最佳方式。

所以,我基本上希望实现的是同时向两个表输入相同数据(对于新记录)并将结果记录匹配在一起的方法(对于现有记录的新条目)。但是同一个名称可能不止一次出现作为一个独特的记录(例如三个人名为约翰史密斯)。

[N.B。有更多的表存储辅助信息,但与问题无关,因为它们不存在,也不会链接到任何其他表。]

1 个答案:

答案 0 :(得分:1)

  

我意识到查询不能用于数据输入

实际上,非复杂查询 通常是可编辑的,只要您想要编辑其数据的表格保留在核心位置即可。的查询。 Access使用许多因素来确定查询是否可编辑 大多数情况下,很容易弄清楚查询为什么变得不可编辑 问自己一个问题:如果我编辑这些数据,Access将如何确保准确地更新数据,而不会产生歧义?

如果您的表已定义主键并且这些是查询的一部分,并且如果没有分组,计算字段(使用某些函数来更改或测试该字段的值的字段)或复杂连接,则查询应保持可编辑状态 你可以在这里阅读更多相关内容:

  

因此,我基本上希望实现的是同时向两个表(对于新记录)输入相同数据并将结果记录匹配在一起(对于现有记录的新条目)的方法。但是同一个名称可能不止一次出现作为一个独特的记录(例如三个人名为约翰史密斯)。

这句话实际证明您的数据库存在设计问题。

数据库设计的基本原则是尽可能地消除冗余。其中一个原因实际上是避免在多个地方更新相同的数据。

另一个评论:您使用客户端的名称作为自然密钥。坦率地说,它是一个非常好的主意。通常,您希望确保表格的主键构成的内容随着时间的推移是唯一可靠的。
使用人名通常是错误的选择,因为:

  • 人们改名,例如在许多文化中,女性在结婚后改姓 输入名称时可能也会出现拼写错误,如果该数据在不同的表格中用作外键,现在很难纠正它。
  • 随着您的数据库的增长,您可能最终会遇到一些具有相同名称,创建冲突或强制用户更改该名称的人,因此它不会创建副本。

在表中强制记录唯一性的最佳方法是在创建新表时使用Access提出的默认 AutoNumber ID字段。这称为代理键 它并不意味着要编辑,更改甚至显示给用户。它的唯一目的是允许表的主键是唯一的并且不随时间变化,因此它可以可靠地用作从一个表到另一个表引用记录的方法(如果表需要引用特定记录,它将包含一个将保存ID的字段。该字段称为外键)。

您对表的名称不够精确:将每个表视为实体保存相关数据。
你有一个名为AllList的表的事实意味着它的目的不是那么好想的;这听起来像是一个全能而不是精心设计的实体 相反,如果这是您的客户列表,则只需将其称为Client。该表的每条记录都包含单个客户的信息(无论是使用复数还是单数都取决于您,只是坚持您的选择,但保持一致非常重要。)
不要使用客户端的名称作为密钥,而是创建ID字段,自动编号,并将其设置为主键。

让我们重命名"社会工作注册",其中包含客户的案例,简称为ClientCase。从你对表格的描述中可以清楚地看出这种关系,但是表格名称本身并不清楚(顺便说一下,我知道Access允许表格和字段名称中的空格,但使用它真的很糟糕)如果你至少关心你工作的未来,那就可以了。)

在此中,创建一个ClientID号码字段(外键),该字段将保存ID表中相关客户的ClientCase

您不会谈论客户与其案例之间的关系。这是您必须明确的另一个领域:单个客户可以拥有多少个案例?

  • 最多1个案例? (0或1个案例)
  • 正好是1个案例?
  • 至少一个案例? (1个或多个案例)
  • 任意数量的案件? (0个或更多个案)

了解这一点对于在查询中选择正确类型的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查询。从您提供的描述中,很难真正理解设计的实际细节,并告诉您它失败的原因以及如何使其发挥作用。