1、例如,无论何时在表之间建立一对多或多对多关系,都需要重复主键字段中的数据.第二类必要冗余是在使用数据库的过程中产生的。例如,您可能会多次输入某个城市或供应商的名称,或多次输入某个常见人名(如 John Smith)。如果出现这种情况,则可以放心使用这些重复数据,因为数据库中的其他字段(例如主键值、地址和邮政编码)将包含足够多的唯一信息来将这些记录排除在重复记录之外。不必要的冗余可能以多种形式出现:两条或更多条记录包含重复字段。即使并非两条记录中的所有字段都包含匹配值,这两条记录也可能被视为重复记录。例如,在下图中,您将看到 Antonio Moreno Taqueria 的两条记录。即使每条记
2、录都具有唯一的客户 ID(最左侧列中的值),“名称”、“地址”和“城市”字段中的值仍有可能相同。在这种情况下,即使只有部分匹配,您仍有必要应用您的业务知识判断记录是否为重复记录。两个或更多个表可以包含类似数据。例如,您可能发现“顾客”表和“客户表中包含相同客户的记录。手动比较数据库并不是一件容易的事,即使是很小的数据库也是如此。 注释如果您采取措施删除表中的重复数据后仍然发现窗体或报表中有重复的数据,则可能是由于窗体或报表设计错误造成的。请确保基础表与查询之间的连接正确,并且窗体或报表部分所包含的、绑定到同一个控件来源的控件不超过一个。2、了解在什么情况下记录不是重复记录在某些情况下,例如查看
3、查询所返回的数据时,即使基础表看起来仅包含唯一记录,您仍可能会看到看似重复的记录.如果您的视图不包括唯一标识记录的字段,则可能会出现问题。例如,下图显示了查询返回的数据.在该视图中,有多条记录显示为重复记录.如果您为查询添加一个或多个其他字段,例如客户名称或每份订单的主键字段(订单 ID),您会发现实际上每条记录都是唯一的,如下图所示:创建查询时,通常应包括一个或多个能唯一标识每条记录的字段。通常,主键字段就能够实现该功能,但您也可以改用其他字段的组合。例如,假设某个常见联系人姓名或某个城市名出现多处,但如果您包括了电话号码和地址,则这种数据组合将使每条记录都具有唯一性。3、处理重复数据时需要
4、考虑的因素1)处理重复记录的方式取决于以下几个因素:重复的性质和范围您只是在单个表中发现重复数据,还是发现两个相似的表(位于同一数据库或位于两个不同的数据库)中包含重叠数据?或者,您是否在基于两个或更多个相关表的视图中发现重复记录?您的特定需求您希望如何处理重复数据?您希望从数据库中删除重复记录,还是仅在视图中隐藏它们?或者,您是否希望对重复记录中的值进行计数、计算平均值或汇总?您是否需要考虑删除或隐藏哪些重复记录?如果是,您希望手动查看并删除这些记录,还是基于某个条件删除这些记录?在开始删除记录之前,您是否还希望更新或合并一条或多条记录?通过回答上述问题(或类似的问题),再加上您的数据知识,
5、就可以制定一份处理冗余数据的计划。2)删除重复数据的常规准备工作如果您选择删除重复记录,则必须先处理所有现有的表关系。通常,大部分数据库都使用一对多关系.例如,您的客户可能比较少,但每个客户下的订单非常多。因此,客户数据表位于关系的“一端,而订单数据位于关系的“多端。在进行操作时请记住以下规则:如果要删除的数据位于关系的“多”端,则可以直接删除数据而无需执行其他步骤.但如果要删除的数据位于“一”端,则必须在关系中设置一个属性,否则,Access 将禁止删除。开始删除冗余数据之前,请考虑采用下面的一种或多种方法来准备数据库:确保数据库不是只读数据库。确保您具有编辑或删除数据库中的记录的必要权限。
6、请求数据库的所有其他用户关闭您要处理的对象。这有助于避免锁定冲突。 提示如果有大量用户连接到该数据库,您可能需要关闭该数据库,然后以独占模式将它重新打开。删除记录之前请备份数据库。您不能取消或撤消删除操作。恢复已删除记录的唯一方法是从备份中恢复.删除操作还可能会删除相关表中的记录,因此在开始删除操作之前最好先备份整个数据库。二、在单个表中查找和编辑、隐藏或删除重复数据以下各节中的步骤介绍了在单个表中查找和编辑、隐藏或删除重复值的最常见方法。1、查找其中某些字段全部或部分匹配的记录查找包含全部或部分匹配值的记录的过程包括以下主要步骤:使用“查找重复项查询向导创建一个查询。默认情况下,仅当每个字段
7、中的值完全相同时,查询才会返回重复记录.如果需要查找各记录部分字段重复项,可以在查询中使用一个表达式,也可以更改结构化查询语言 (SQL) 代码。本节中的步骤介绍了如何创建重复项查询,以及如何更改查询来查找部分匹配项。这些步骤将使用示例中提供的“顾客”表,查找“公司名称相同的记录(示例中查询“使用查找重复项查询向导查找重复项)。创建重复项查询1)在“新建查询对话框中,单击“查找重复项查询向导”,然后单击“确定”。如果显示提示消息通知您未安装此功能,请单击“是安装该向导。2)在表列表中,选择“顾客”表,然后单击“下一步. 3)在可用字段列表中,仅选择包含重复信息的字段: “公司名称”、“地址”和
8、“城市”字段,因为只有这些字段包含完全匹配(逐个字符比较)的值。单击“下一步”. 如果在此步骤中添加的字段不包含完全匹配(逐个字符比较)的值,则查询可能不会返回任何结果。4)在下一个可用字段列表中,选择包含要检查或更新的字段,或选择包含有助于您区分重复记录和非重复记录的数据的字段.示例中添加“联系人姓名”和“移动电话”字段,因为这两个字段中的数据可以帮助您查找重复值,并且可能指出输入这些值的原因。单击“下一步”。5)输入查询名称,然后单击“完成”运行查询。您将看到以下结果:您在查阅“顾客”表时,可能已经注意到有两条以上的公司名称重复的记录(该表包含 4 条)。您没有看到其他重复记录是因为“地址
9、”字段中的值不完全匹配(逐个字符比较).您可以修改查询,以返回部分匹配的值.下一组步骤将介绍如何修改查询。自定义查询以查找部分匹配项1)将上面创建的查询切换到 SQL 视图.您将看到以下 SQL 语句:SELECT 顾客。公司名称, 顾客.地址, 顾客.城市, 顾客。联系人姓名, 顾客。移动电话FROM 顾客WHERE (顾客。公司名称) In (SELECT 公司名称 FROM 顾客 As Tmp GROUP BY 公司名称,地址,城市 HAVING Count(*)1 And 地址 = 顾客.地址 And 城市 = 顾客.城市)ORDER BY 顾客.公司名称, 顾客。地址, 顾客。城市;
10、2)修改 SQL 代码以查找和比较部分值。在本例中,WHERE 子句使用另一个 SELECT 语句对照表中的其他所有记录来比较每条记录,以确定重复项集合.假定您需要修改“地址”字段以返回部分匹配项。下表显示了如何修改该语句,以便只须匹配字段中的前七个字符。修改内容以红色显示:公司名称, 顾客.地址, 顾客。城市, 顾客。联系人姓名, 顾客。公司名称) In (SELECT 公司名称 FROM 顾客 As Tmp GROUP BY 公司名称,left(地址,7),城市 HAVING Count()1 And left(地址,7) = left(顾客.地址,7) And 城市 = 顾客.城市)OR
11、DER BY 顾客.公司名称, 顾客.地址, 顾客.城市;修改完语句后,单击“运行 以运行查询并在数据表视图中显示结果。现在,查询将返回全部四条重复记录,因为现在只需匹配“地址”字段中的前 7 个字符(从左边开始):2、手动编辑记录在数据表视图中打开在上面的步骤中创建的查询。请执行下列操作之一:要编辑某个字段中的值,请选择该字段并输入新值。要删除整条记录(一行),请单击行选择器(行旁边的空框)并按 Delete。如果找到大量重复记录(以致于您无法手动删除),可以通过创建并运行一个删除查询来删除这些记录。有关创建并运行删除查询所涉及的基本步骤,请参阅本文后面的使用删除查询删除重复记录一节。3、显
12、示唯一记录大部分数据库表都包含一个唯一标识每条记录的字段,该字段通常为主键字段。如果您在设计查询时隐藏或省略这些类型的字段,可能会看到看似重复的记录,因为所有返回字段中的值都是匹配的。例如,下图显示的查询结果中有两份订单(位于红色框中)看起来是重复的。但是,如果查询包括了主键字段(例如订单ID)或能够唯一标识每条记录的其他字段(例如发货日期),您会发现这些记录并非重复记录。本节将介绍如何隐藏查询返回的所有字段中的值均匹配的重复记录。执行操作时,请记住以下规则:只有当查询结果中的所有字段均包含相同的值时,才会将两条或多条记录视为重复记录。即使有一个字段中的值不同,每条记录也将是唯一记录,因此您不
13、能使用此处介绍的方法隐藏这些记录.如果要隐藏这些类型的重复记录,可以将总计查询与聚合函数(例如 FIRST、MIN、MAX 等等)一起使用。有关执行此操作的信息,请参阅本文后面通过指定在结果中显示哪些重复记录来显示不同的记录一节。Access 提供了在查询结果集中显示唯一值的方法:设置“唯一值”属性将查询的“唯一值属性设置为“是”后,如果查询处于数据表视图,则您不能编辑字段值或删除数据。要编辑或删除数据,请在数据表视图中打开基础表。单击“运行”如果数据包含重复记录,将仅显示这些记录中的一条。4、通过指定在结果中显示哪些重复记录来显示不同的记录当有重复记录时,您可能只希望看到不同的值,即:仅显示
14、每组重复记录中的一条记录.要查询某条特定的重复记录,可以使用一种称为总计查询的查询。向总计查询添加字段时,查询会将每个字段视为一个组,并且您可以针对组中的数据运行一类称为聚合函数的函数.这些函数反过来又可以从一组重复记录中返回一条记录。您可以通过多种方法对这些数据使用总计查询和聚合函数:使用 First 函数,仅显示最先输入的记录。使用 Last 函数,仅显示最后输入的记录。使用 Max 或 Min 函数,仅显示特定字段中的值最小或最大的记录.例如,您可以使用 Max函数显示具有最近日期的记录,或使用 Min 函数显示具有最早日期的记录. 注释您不能编辑此类查询返回的数据。下面步骤介绍如何查询
15、原始记录、最近的记录和最早的记录。这些步骤将使用示例中的“员工”表.使用总计查询单击查询“新建”按钮. 在“显示表”对话框中,双击包含“员工表,然后单击“关闭”。该表将显示在查询设计器的上半部分.仅添加包含重复数据的字段。您可以双击字段或将其从表窗口拖动到设计网格中的“字段”行。示例中添加“姓氏、“名”和“生日”字段,因为通过这些字段可以确定重复项。添加指定选择条件的字段。添加“聘用日期”字段,因为该字段包含对应于同一个员工姓名的两个不同的值。请勿向网格添加其他字段。总计查询只能包括具有重复数据的字段以及包含测试中要使用的数据的另一个字段。单击“总计 。设计网格中将显示“总计”行,包含表字段的
16、列中将显示“分组”。将所有字段的“总计”行设置保留为“分组”,然后单击“运行” 以运行查询并在数据表视图中显示结果.查询将返回两次“Jean Philippe Bagel”,因为这两条重复记录包含不同的聘用日期。返回设计视图,指定从重复项中选择一条记录的条件。要使用示例数据,请按如下所示更改“总计”行中“聘用日期”列中的值. 要查看最早的记录,请将值更改为“第一条记录”。要查看最近输入的记录,请将值更改为“最后一条记录”。要根据特定字段中的值选择记录,您需要使用 Max 或 Min 函数。在本例中,您需要查看包含最早聘用日期的记录。要执行此操作,请将值更改为 Min。如果查询找到所需结果,则可
17、以将其更改为删除查询并运行该查询,以方便快捷地删除重复记录。有关运行删除查询的信息,请参阅本文后面的使用删除查询删除重复记录一节。5、对重复记录使用聚合函数(Count、Sum、Average)除了从一组重复记录中返回某条特定记录以外,您还可以使用聚合函数对重复记录进行计数或汇总一组重复记录的数据。通常,您需要在执行合并或删除重复数据的步骤之前运行这些函数.您可以通过创建使用 Count、Sum 和 Average 等聚合函数的总计查询,来汇总表中的重复数据.在数据表视图中查看总计查询时,不能编辑字段值或删除记录.要编辑或删除数据,请在数据表视图中打开基础表。本节中的步骤将使用示例中“欠款金额
18、”表(示例中查询“使用聚合函数查找重复记录”)。创建总计查询请在新建查询中添加“欠款金额”表。添加包含重复数据的字段:“公司名称”和“城市”字段,因为这些字段可以确定重复项。添加提供选择条件的字段.则请添加“应付金额”字段。设计网格中将显示“总计”行,每个字段的行中将显示“分组”。根据您的需要,请执行下列操作之一:要对多条记录进行计数,请选择包含要计数的值的字段,然后在“总计行中将字段的值更改为“计数”.如果使用示例数据,请将“应付金额中的值设置为“计数”。要计算总金额,请将字段中的值设置为“求和”。总计查询只能显示汇总信息,而不能显示单个值。 以运行查询并在数据表视图中显示结果. 6、使用删
19、除查询删除重复记录当您确认某个表包含重复记录后,可以通过创建并运行一个删除查询来删除不需要的数据。创建并运行删除查询的过程通常包含以下主要步骤:1)计划删除。在此过程中,您需要确定要删除的数据是否与另一个表中的数据相关。如果是,则需要确定数据是位于一对多关系的“一端,还是位于一对多关系的“多”端。如果数据位于“一端,则必须先在关系中启用一个属性,然后才能删除数据。如果数据位于“多”端,则可以创建并运行查询,而无需采取其他操作.您可以使用“关系”工具来检查数据库中的关系。2)创建一个查询,例如选择查询或唯一值查询,添加或更改任何条件,直至查询仅返回要删除的数据. 3)将该查询转换为删除查询,然后
20、运行该删除查询来删除不需要的数据。要点您不能撤消删除查询的结果。因此,在运行删除查询之前,应当备份数据库。有关备份数据库的信息,请参阅本文前面的备份数据库一节.下面的步骤说明了如何创建选择查询,将它转换为删除查询,然后运行删除查询来删除记录。示例中“使用删除查询删除重复记录1为删除“顾客”表中早期录入的公司名称重复的记录。1)创建选择查询注释:必须使用条件,以便仅返回要删除的记录。否则,删除查询将删除表中的所有记录.单击“运行”.验证查询是否返回要删除的记录。将查询保持打开状态,然后继续执行下面的步骤。2)将选择查询转换为删除查询并运行该查询以删除数据单击“设计视图”,从数据表切换到SQL视图
21、。将SQL语句更改如下,注意红色部分与选择查询的SQL语句一致: DELETE 顾客。顾客IDWHERE (顾客.顾客ID) In (SELECT Min(顾客.顾客ID) AS 顾客ID之最小值GROUP BY 顾客.公司名称HAVING (Count(顾客.城市)1);确认要删除这些数据,然后单击“运行 以运行查询并在数据表视图中查看结果。Access 将提示您确认删除。单击“是删除数据。7、隐藏确认消息如果不想在每次运行删除查询或其他动作查询时都看到确认消息,请执行以下步骤.单击“工具”“选项”。在“编辑/查找”部分中的“确认”下,清除“操作查询”复选框. 单击“确定”关闭“Access
22、 选项”对话框。8、禁止用户输入重复值您可以实施多条规则来防止用户输入重复数据:将字段设置为仅包含唯一值。要实施此规则,请执行下列操作之一:1)将该字段指定为主键.主键字段仅接受唯一值,如果用户输入重复值,该字段将提示用户。2)如果表中已经有主键,则请在表的设计视图中将该字段的“索引”属性设置为“有(无重复)”。此属性将禁止该字段对多条记录接受相同的值。请记住,在某些情况下(例如包含名称和城市信息的字段),您必须接受重复值。3)指定每条记录的两个或更多个字段中的值组合必须是唯一的。例如,假设您有一个包含联系人数据的表。您可以将“联系人姓名”、“地址”、“城市等字段的组合指定为表的主键。这种方法很有效,因为出现两个联系人不但姓名相同而且地址和所在城市也相同的可能性微乎其微.要创建多字段主键,请执行以下步骤:在设计视图中打开表. 单击第一个字段左侧的行选择器选中整行。按住 Ctrl,单击要包括在主键中的其他所有字段的行选择器. 单击鼠标右键,然后单击快捷菜单中的“主键 . 此步骤会将主键中每个字段的“索引属性设置为“有(有重复)”,以便您可以在多条记录中输入相同的姓名、地址或城市,但您不能在多条记录中输入完全相同的姓名、地址和城市组合。例如,您可以有两个名为费英博并且居住在玉林街 2345 号的联系人,但他们不能都居住在昆明。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1