- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
|
本文介绍了如何使用 Microsoft Office Access 2007 来查找和隐藏或删除重复数据。一般说来,您应当尽可能删除重复的值以降低成本并提高数据准确性。Office Access 2007 提供了多种方法来查找和隐藏或删除重复值,本文介绍了如何使用最常见的方法来执行这些操作。) { X: R) b9 L6 B+ c& Z
您要做什么?
) S6 | r* R$ ]8 W2 e了解重复数据使用关系数据库的一个主要原因就是为了避免重复数据。但是,随着数据库存在时间的延长,常常会出现重复的值,尤其是当有多个用户输入数据时更容易出现这种情况。通常,删除重复数据可以节省存储费用,并使数据保持较高的准确性。这种高准确性反过来又可以帮助您做出更好的业务决策。例如,如果您多次输入同一份销售订单,则客户可能会收到不需要的货物,这种重复发货将增加运货成本和会计成本,从而造成浪费。
" N, ~" J5 x0 o d' p重复的真正含义
0 u0 R- e8 Y0 {, y在您采取措施标识和删除重复记录之前,请记住:您需要依赖您的数据知识。与设计数据库的过程不同,您无法遵循一组特定的规则或过程来精确地查找和删除重复记录。在执行操作时,请记住一点:数据库查询可能会返回看似重复的记录,但实际上这些结果都是有效数据。如果您未在查询中包括唯一标识每条记录的字段,就常常会发生这种表面上的重复。有关如何在查询中包括必要的字段并避免出现误报的详细信息,请参阅本文后面的了解在什么情况下记录不是重复记录一节。. ?0 m/ s& R- D/ F, q; f4 i
此外,您还必须记住:并非所有重复数据都可以删除,因为有些重复是数据库正常工作所必需的。换句话说,数据库可能既包含必要的冗余,也包含不必要的冗余,而您只希望删除不必要的冗余。
2 Y2 e& Y8 D' `6 s+ J6 U必要的冗余通常分为两类。第一类冗余确保数据库可以正常工作。例如,无论何时在表之间建立一对多或多对多关系,都需要重复主键字段中的数据。
/ o( b% ~& S& Q# V2 N5 d第二类必要冗余是在使用数据库的过程中产生的。例如,您可能会多次输入某个城市或供应商的名称,或多次输入某个常见人名(如 John Smith)。如果出现这种情况,则可以放心使用这些重复数据,因为数据库中的其他字段(例如主键值、地址和邮政编码)将包含足够多的唯一信息来将这些记录排除在重复记录之外。 @; S# |$ V+ I: `5 H9 y
不必要的冗余可能以多种形式出现:$ \+ f4 m" i- Z$ v; u* h- b& f: U
- 两条或更多条记录包含重复字段。 即使并非两条记录中的所有字段都包含匹配值,这两条记录也可能被视为重复记录。例如,在下图中,您将看到 Antonio Moreno Taquería 的两条记录。
6 |% q! A3 h& ?即使每条记录都具有唯一的客户 ID(最左侧列中的值),“名称”、“地址”和“城市”字段中的值仍有可能相同。在这种情况下,即使只有部分匹配,您仍有必要应用您的业务知识判断记录是否为重复记录。 - 两个或更多个表可以包含类似数据。 例如,您可能发现“顾客”表和“客户”表中包含相同客户的记录。
: G7 {2 j9 I' [即使两个表具有不同的结构,它们仍有可能包含同一类型的信息 - 客户数据,因此,应当考虑将所有唯一(非重复)值合并到一个表中并删除多余的表。 - 两个或更多个数据库包含类似数据。 如果您发现两个或更多个数据库包含类似数据,或者您继承了与当前数据库重叠的数据库,则必须对这些数据库的数据和结构进行比较,然后采取必要的步骤合并数据库。 手动比较数据库并不是一件容易的事,即使是很小的数据库也是如此。如果需要这方面的帮助,可以向许多第三方供应商购买用于比较 Access 数据库的内容和结构的专用工具。
; S- \, }; h; V; ?' X5 k请访问 Microsoft Office 市场的“数据库管理”部分,查找具有最新功能的数据库管理工具。) D* d+ Q1 c# R6 d X
注释 如果您采取措施删除表中的重复数据后仍然发现窗体或报表中有重复的数据,则可能是由于窗体或报表设计错误造成的。请确保基础表与查询之间的连接正确,并且窗体或报表部分所包含的、绑定到同一个控件来源的控件不超过一个。
4 R9 I+ o6 N/ P- C! P. O4 U0 N6 U/ h有关报表设计的详细信息,请参阅修改、编辑或更改报表一文。
; q$ ~2 T2 B$ Y7 i e了解在什么情况下记录不是重复记录在某些情况下,例如查看查询所返回的数据时,即使基础表看起来仅包含唯一记录,您仍可能会看到看似重复的记录。如果您的视图不包括唯一标识记录的字段,则可能会出现问题。例如,下图显示了查询返回的数据。
% Z! C- v8 l4 l: c/ t% P4 Z
9 q- G& }' {& U2 [5 h! {9 C7 h在该视图中,有多条记录显示为重复记录。如果您为查询添加一个或多个其他字段,例如客户名称或每份订单的主键字段(订单 ID),您会发现实际上每条记录都是唯一的,如下图所示:
/ \- b4 S I. O, U3 c# N" u5 y, Q4 ^ n8 j" Q
创建查询时,通常应包括一个或多个能唯一标识每条记录的字段。通常,主键字段就能够实现该功能,但您也可以改用其他字段的组合。例如,假设某个常见联系人姓名或某个城市名出现多处,但如果您包括了电话号码和地址,则这种数据组合将使每条记录都具有唯一性。* N% {7 E/ J) Q7 m
处理重复数据时需要考虑的因素处理重复记录的方式取决于以下几个因素:
! |1 p' `/ |, w* A3 n- 重复的性质和范围 您只是在单个表中发现重复数据,还是发现两个相似的表(位于同一数据库或位于两个不同的数据库)中包含重叠数据?或者,您是否在基于两个或更多个相关表的视图中发现重复记录?
- 您的特定需求 您希望如何处理重复数据?您希望从数据库中删除重复记录,还是仅在视图中隐藏它们?或者,您是否希望对重复记录中的值进行计数、计算平均值或汇总?您是否需要考虑删除或隐藏哪些重复记录?如果是,您希望手动查看并删除这些记录,还是基于某个条件删除这些记录?在开始删除记录之前,您是否还希望更新或合并一条或多条记录?
通过回答上述问题(或类似的问题),再加上您的数据知识,就可以制定一份处理冗余数据的计划。
|" j5 B/ e/ x) S3 `删除重复数据的常规准备工作如果您选择删除重复记录,则必须先处理所有现有的表关系。通常,大部分数据库都使用一对多关系。例如,您的客户可能比较少,但每个客户下的订单非常多。因此,客户数据表位于关系的“一”端,而订单数据位于关系的“多”端。
+ A! U+ T: G. f! H+ d4 T% q' u在进行操作时请记住以下规则:如果要删除的数据位于关系的“多”端,则可以直接删除数据而无需执行其他步骤。但如果要删除的数据位于“一”端,则必须在关系中设置一个属性,否则,Access 将禁止删除。" ?! V$ a& ]' [
有关删除位于“一”端的数据的详细信息,请参阅使用删除查询从数据库中删除一项或多项记录一文。
6 H9 V$ w7 z+ f m) n- n开始删除冗余数据之前,请考虑采用下面的一种或多种方法来准备数据库:# t8 Z% z' B# R2 \# P3 f& A8 Z( v
- 确保数据库不是只读数据库。
- 确保您具有编辑或删除数据库中的记录的必要权限。
- 请求数据库的所有其他用户关闭您要处理的对象。这有助于避免锁定冲突。 提示 如果有大量用户连接到该数据库,您可能需要关闭该数据库,然后以独占模式将它重新打开。要执行此操作,请在 Access 中单击“Microsoft Office 按钮”,然后单击“打开”。通过浏览找到并选择数据库,单击“打开”按钮旁边的箭头,然后单击“以独占方式打开”。
4 ?$ K) n1 ?$ _' Y6 U/ V- _
$ F, T$ K ?, i - 删除记录之前请备份数据库。您不能取消或撤消删除操作。恢复已删除记录的唯一方法是从备份中恢复。删除操作还可能会删除相关表中的记录,因此在开始删除操作之前最好先备份整个数据库。 备份数据库
- 单击“Microsoft Office 按钮”,单击“管理”旁边的箭头,然后单击“备份数据库”。 将显示“另存为”对话框,Access 会将当前日期追加到文件名的后面。例如,如果您有一个名为“Assets”的数据库,Access 将创建以下类型的文件名:Assets_2006-10-29。
- 接受默认名称和位置,或者选择其他名称或位置,然后单击“保存”。
Access 将关闭原始文件,创建备份,然后重新打开原始文件。" J6 n/ m; ?- _8 X$ }' Q4 l$ H
若要还原到备份,请关闭并重命名原始文件,以便备份副本可以使用原始版本的名称。将原始版本的名称指定给备份副本,然后在 Access 中打开它。
( s2 R/ o- P% o. W 返回页首+ [5 O4 M3 B' x# g/ ?
准备一些示例数据本文的操作方法部分中提供了示例数据表。操作步骤使用示例表来帮助您理解查询的工作方式。如果您愿意,可以选择将示例表输入或导入到新的或现有数据库中。4 H! m, @% X/ z o5 a4 Y( _9 d& s
Access 提供了几种将这些示例表添加到数据库的方法。您可以手动输入数据,也可以将每个表复制到电子表格程序(如 Office Excel 2007)中然后将工作表导入 Access,或者可以将数据粘贴到文本编辑器(如记事本)中然后从生成的文本文件中导入数据。
5 w$ G) {7 x8 ~' e6 r本部分中的步骤介绍了如何在空白数据表中手动输入数据,以及如何将示例表复制到 Excel 中,然后将这些表导入 Access 2007。有关创建和导入文本数据的详细信息,请参阅文章导入或链接文本文件中的数据。! ^+ t8 D/ X3 v, V, L8 A" f( C* E
本文中的操作步骤使用下列表:
1 E6 p' v8 h2 u2 v( a, R“顾客”表:
- r; R, \: u3 X& P# D/ Q' |
, ]. O9 I6 K. k2 P; |公司名称 | 联系人姓名 | 地址 | 城市 | 邮政编码 | 移动电话 | Baldwin Museum of Science | Josh Barnhill | 1 Main St. | New York | 12345 | (505) 555-2122 | Blue Yonder Airlines | Waleed Heloo | 52 1st St. | Boston | 23456 | (104) 555-2123 | Coho Winery | Pica Guido | 3122 75th Ave. S.W. | Seattle | 34567 | (206) 555-2124 | Contoso Pharmaceuticals | Jean Philippe Bagel | 1 Contoso Blvd. | London | NS1 EW2 | (171) 555-2125 | Fourth Coffee | Julian Price | Calle Smith 2 | Mexico City | 56789 | (7) 555-2126 | Coho Winery | Christine Hughes | 3122 75th St. S. | Seattle | 34567 | (206) 555-2125 | Humongous Insurance | Steve Riley | 67 Big St. | Tampa | 01234 | (916) 555-2128 | Trey Research | Dana Birkby | 2 Nosey Pkwy | Portland | 43210 | (503) 555-2129 | Fourth Coffee | Reshma Patel | Calle Smith 2 | Mexico City | 56789 | (7) 555-2233 | " M- T, _! H1 V! m& J' N
* M2 X; u) }& j; r0 H
“员工”表: s# m+ c: N8 z$ |8 {+ [1 x8 A
1 _, A- a/ @9 A ?& C0 V3 u2 p姓氏 | 名 | 地址 | 城市 | 生日 | 雇佣日期 | Barnhill | Josh | 1 Main St. | New York | 1968-02-05 | 1994-07-04 | Heloo | Waleed | 52 1st St. | Boston | 1957-05-22 | 1996-11-22 | Guido | Pica | 3122 75th Ave. S.W. | Seattle | 1960-11-11 | 2000-03-11 | Bagel | Jean Philippe | 1 Contoso Blvd. | London | 1964-03-22 | 1998-06-22 | Price | Julian | Calle Smith 2 | Mexico City | 1972-06-05 | 2002-01-05 | Hughes | Christine | 3122 75th St. S. | Seattle | 1970-01-23 | 1999-04-23 | Riley | Steve | 67 Big St. | Tampa | 1964-04-14 | 2004-10-14 | Birkby | Dana | 2 Nosey Pkwy | Portland | 1959-10-29 | 1997-03-29 | Bagel | Jean Philippe | 1 Contoso Blvd. | London | 1964-03-22 | 1998-06-20 | % f$ R& L& E/ u A. x
" C |7 Q$ T4 c3 e
“欠款金额”表:4 ^4 e# {" Z# ?$ Z
* l0 P+ k8 l! y3 s! j+ x' H1 y
公司名称 | 联系人姓名 | 地址 | 城市 | 邮政编码 | 移动电话 | 应付金额 | Baldwin Museum of Science | Josh Barnhill | 1 Main St. | New York | 12345 | (505) 555-2122 | $556.78 | Blue Yonder Airlines | Waleed Heloo | 52 1st St. | Boston | 23456 | (104) 555-2123 | $1,893.24 | Coho Winery | Pica Guido | 3122 75th Ave. S.W. | Seattle | 34567 | (206) 555-2124 | $321.79 | Contoso Pharmaceuticals | Jean Philippe Bagel | 1 Contoso Blvd. | London | NS1 EW2 | (171) 555-2125 | £457.68 | Fourth Coffee | Julian Price | Calle Smith 2 | Mexico City | 56789 | (7) 555-2126 | $98.75 | Coho Winery | Christine Hughes | 3122 75th St. S. | Seattle | 34567 | (206) 555-2125 | $321.79 | Humongous Insurance | Steve Riley | 67 Big St. | Tampa | 01234 | (916) 555-2128 | $297.45 | Trey Research | Dana Birkby | 2 Nosey Pkwy | Portland | 43210 | (503) 555-2129 | $509.09 | Fourth Coffee | Reshma Patel | 2 Calle Smith | Mexico City | 56789 | (7) 555-2233 | $98.75 |
8 D9 \; @+ B# X% _4 B4 Q3 R0 ~, \: r; z1 g& Z; `8 b
“客户”表:
2 {8 u3 [" ]* k7 f2 n7 b3 T8 P0 n x1 C$ ?$ M! ^
名称 | 地址 | 城市 | 移动电话 | 传真 | Baldwin Museum of Science | 1 Main St. | New York | (505) 555-2122 | (505) 555-2122 | Blue Yonder Airlines | 52 1st St. | Boston | (104) 555-2123 | (104) 555-2123 | Coho Winery | 3122 75th Ave. S.W. | Seattle | (206) 555-2124 | (206) 555-2124 | Contoso Pharmaceuticals | 1 Contoso Blvd. | London | (171) 555-2125 | (171) 555-2125 | Fourth Coffee | Calle Smith 2 | Mexico City | (7) 555-2126 | (7) 555-2126 | Consolidated Messenger | 3122 75th St. S. | Seattle | (206) 555-2125 | (206) 555-2129 | Graphic Design Institute | 67 Big St. | Tampa | (916) 555-2128 | (916) 555-2128 | Litware, Inc. | 3 Microsoft Way | Portland | (503) 555-2129 | (503) 555-2110 | Tailspin Toys | 4 Microsoft Way | Portland | (503) 555-2233 | (503) 555-2239 |
' e; f! { }( v
' f* F5 a1 ~+ d/ [9 Z: p( U手动输入示例数据- 在“创建”选项卡上的“表”组中,单击“表”。 ; E8 |- _( R; c+ \5 t
Access 向数据库中添加了一个新的空白表。' l5 s" H( p2 s! u1 j) ~/ |
注释 如果您要打开一个新的空数据库,则不需要按照此步骤操作,但是如果要向数据库中添加表,则需要按照此步骤操作。 - 双击标题行中的第一个单元格,然后在示例表中键入字段的名称。 默认情况下,Access 使用文本“添加新字段”来指示标题行中的空白字段,如下所示: " @* _9 G) K: F0 m# r9 e! y
- 使用箭头键移动到下一个空白标题单元格,然后键入第二个字段名称(也可以按 Tab 或双击新单元格)。重复此步骤,直到输入了所有字段名称。
- 在示例表中输入数据。 输入数据时,Access 会推断每个字段的数据类型。如果您对关系数据库不熟悉,则应为表中的每个字段都设置特定的数据类型,如“数字”、“文本”或“日期/时间”。设置数据类型有助于确保数据输入正确,也有助于防止出现错误,如在计算中使用电话号码。对于这些示例表,应让 Access 推断数据类型。
- 输入完数据后,请单击“保存”。 键盘快捷方式 按 Ctrl+S。
9 Z, C! i* b9 k# l: L) y将显示“另存为”对话框。 - 在“表名称”框中,键入示例表的名称,然后单击“确定”。 您应使用每个示例表的名称,因为操作方法部分中的查询会使用这些名称。
5 P" j' ^2 U* z) ]4 S7 G 创建示例工作表- 启动电子表格程序并创建一个新的空白文件。如果使用的是 Excel,则默认情况下会创建一个新的空白工作簿。
- 复制前面部分中的第一个示例表,并将其粘贴到第一个工作表,从第一个单元格开始进行操作。
- 使用电子表格程序提供的方法,为工作表赋予与示例表相同的名称。例如,如果示例表名为“类别”,请为工作表赋予相同的名称。
- 重复步骤 2 和步骤 3,将每个示例表都复制到一个空白工作表中,并重命名该工作表。 注释 您可能需要向电子表格文件中添加工作表。有关执行该任务的信息,请参阅电子表格程序的帮助。
- 将工作簿保存到计算机或网络上的方便位置,然后执行下一组步骤。
基于工作表创建数据库表- 在新数据库或现有数据库中: 在“外部数据”选项卡上的“导入”组中,单击“Excel”。; V1 e) ]1 I- ^: |
8 Z& o x0 Y) `& ?4 D3 {+ y5 o
- 或 -
" j' `) T' G0 ?7 s8 O, E5 k单击“其他”,然后从列表中选择一个电子表格程序。
( u- Q" Q1 J4 T. M将显示“获取外部数据 - 程序名 电子表格”对话框。 - 单击“浏览”,打开在前面的步骤中创建的电子表格文件,然后单击“确定”。 “导入电子表格向导”将启动。
- 默认情况下,向导将选择工作簿中的第一个工作表(如果您遵循上一节中的步骤,则第一个工作表为“顾客”),并且工作表中的数据将显示在向导页的下半部分。单击“下一步”。
- 在向导的下一页上,单击“第一行包含列标题”,然后单击“下一步”。
- (可选)在下一页上,使用“字段选项”下的文本框和列表来更改字段名称和数据类型,或者在导入操作中省略字段。否则,请单击“下一步”。
- 使“让 Access 添加主键”选项保持选中状态,然后单击“下一步”。
- 默认情况下,Access 会将该工作表的名称应用到新表。接受该名称或输入其他名称,然后单击“完成”。
- 重复步骤 1 至 7,直到基于 Excel 工作簿中的每个工作表创建了一个表。
返回页首
4 H" u$ o" L, J. R! T2 U0 g在单个表中查找和编辑、隐藏或删除重复数据以下各节中的步骤介绍了在单个表中查找和编辑、隐藏或删除重复值的最常见方法。% U3 \! A+ P# l
+ ~* a3 M4 [# w' H% u1 d. f) P" X$ L
查找其中某些字段全部或部分匹配的记录查找包含全部或部分匹配值的记录的过程包括以下主要步骤:2 O8 E+ n# @# u
- 使用“查找重复项向导”创建一个查询。默认情况下,仅当每个字段中的值完全匹配时,查询才会返回匹配记录。如果需要查找部分匹配项,可以在查询中使用一个表达式,也可以更改结构化查询语言 (SQL) 代码。
- (可选)在数据表视图中查看查询结果时编辑字段值或删除记录。
- (可选)更改查询中的结构化查询语言 (SQL) 代码,以查找部分匹配的值。如果不更改 SQL 代码,查询将仅返回指定字段中的值完全匹配(逐个字符比较)的记录。
本节中的步骤介绍了如何创建重复项查询,以及如何更改查询来查找部分匹配项。这些步骤将使用下表中提供的“顾客”表。要在数据库中使用该表,请参阅本文前面的准备一些示例数据一节。您可以根据自己的数据对这些步骤进行相应的调整。" z. b2 C' @8 V
公司名称 | 联系人姓名 | 地址 | 城市 | 邮政编码 | 移动电话 | Baldwin Museum of Science | Josh Barnhill | 1 Main St. | New York | 12345 | (505) 555-2122 | Blue Yonder Airlines | Waleed Heloo | 52 1st St. | Boston | 23456 | (104) 555-2123 | Coho Winery | Pica Guido | 3122 75th Ave. S.W. | Seattle | 34567 | (206) 555-2124 | Contoso Pharmaceuticals | Jean Philippe Bagel | 1 Contoso Blvd. | London | NS1 EW2 | (171) 555-2125 | Fourth Coffee | Julian Price | Calle Smith 2 | Mexico City | 56789 | (7) 555-2126 | Coho Winery | Christine Hughes | 3122 75th St. S. | Seattle | 34567 | (206) 555-2125 | Humongous Insurance | Steve Riley | 67 Big St. | Tampa | 01234 | (916) 555-2128 | Trey Research | Dana Birkby | 2 Nosey Pkwy | Portland | 43210 | (503) 555-2129 | Fourth Coffee | Reshma Patel | Calle Smith 2 | Mexico City | 56789 | (7) 555-2233 | p6 S- T/ u6 G3 u
创建重复项查询- 在“创建”选项卡上的“其他”组中,单击“查询向导”。
- 在“新建查询”对话框中,单击“查找重复项查询向导”,然后单击“确定”。 如果显示提示消息通知您未安装此功能,请单击“是”安装该向导。
- 在表列表中,选择包含重复数据的表,然后单击“下一步”。
- 在可用字段列表中,仅选择包含重复信息的字段。如果使用“客户”表,则仅添加“公司名称”、“地址”和“城市”字段,因为只有这些字段包含完全匹配(逐个字符比较)的值。单击“下一步”。 注释 如果在此步骤中添加的字段不包含完全匹配(逐个字符比较)的值,则查询可能不会返回任何结果。
- 在下一个可用字段列表中,选择包含要检查或更新的字段,或选择包含有助于您区分重复记录和非重复记录的数据的字段。如果使用“Customer”表,则请添加“联系人姓名”和“移动电话”字段,因为这两个字段中的数据可以帮助您查找重复值,并且可能指出输入这些值的原因。单击“下一步”。
- 接受建议名称(“查找“顾客”的重复项”)或输入您自己的名称,然后单击“完成”运行查询。如果使用的是“Customer”表,您将看到以下结果:
公司名称 | 地址 | 城市 | 联系人姓名 | 移动电话 | Fourth Coffee | Calle Smith 2 | Mexico City | Julian Price | (7) 555-2126 | Fourth Coffee | Calle Smith 2 | Mexico City | Reshma Patel | (7) 555-2233 |
4 I7 Q: Y1 j( P% W, D0 x! a您在创建“Customer”表时,可能已经注意到有两条以上的重复记录(该表包含 4 条)。您没有看到其他重复记录是因为“地址”字段中的值不完全匹配(逐个字符比较)。您可以修改查询,以返回部分匹配的值。下一组步骤将介绍如何修改查询。 , c5 j: Z+ ~- S4 l3 \, D6 F c/ s
自定义查询以查找部分匹配项- 将查询切换到 SQL 视图。要执行此操作,您可以:
- 右键单击查询的文档选项卡,然后单击“SQL 视图”。
- 在导航窗格中,右键单击查询,然后单击“SQL 视图”。
- 修改 SQL 代码以查找和比较部分值。 如果在前面的步骤中使用了“顾客”表,您将看到以下 SQL 语句:
5 w3 t1 e: f h* X( `, }' VSELECT 顾客.[公司名称], 顾客.[地址], 顾客.[城市], 顾客.[联系人姓名], 顾客.[移动电话]
0 _, c: Q1 f# g4 L5 x) ~FROM 顾客6 N" l- S9 S8 q: a/ C/ R6 w
WHERE (((顾客.[公司名称]) In (SELECT [公司名称] FROM [顾客] As Tmp GROUP BY [公司名称],[地址],[城市] HAVING Count(*)>1 And [地址] = [顾客].[地址] And [城市] = [顾客].[城市]))) _( x2 h: V" \2 [+ \2 Q2 f1 F6 e
ORDER BY 顾客.[公司名称], 顾客.[地址], 顾客.[城市];; b3 m. e1 C# j: \2 \( q3 F
在本例中,WHERE 子句使用另一个 SELECT 语句对照表中的其他所有记录来比较每条记录,以确定重复项集合。' a8 v6 y- p8 X6 M+ G" _4 n
假定您需要修改“地址”字段以返回部分匹配项。下表显示了如何修改该语句,以便只须匹配字段中的前七个字符。修改内容以粗体显示:
, p0 r5 t: p- b6 [; M; |: M9 x. g" LSQL 语句 | 说明 | SELECT 顾客.[公司名称], 顾客.[地址], 顾客.[城市], 顾客.[联系人姓名], 顾客.[移动电话] | 没有更改。您希望查看每组重复记录的相同字段,包括整个“地址”字段。 | FROM 顾客 | 没有更改。 | WHERE (((顾客.公司名称) In (SELECT [公司名称] FROM [顾客] As Tmp GROUP BY [公司名称],Left([地址],7) ,[城市] HAVING | 将 ([地址]) 字段替换为针对“地址”字段 (Left([地址],7)) 运行的函数调用,以确定重复项。此操作将测试“地址”字段中的前七个字符,而不测试整个字段值。要匹配更少的字符,只需输入一个更小的数字即可。要匹配更多字符,只需输入一个更大的数字即可。 | Count(*)>1 And Left([地址],7) =Left([顾客].[地址],7) And [城市] = [顾客].[城市]))) | 要将一条记录的“地址”字段中的前七个字符与另一条记录的“地址”字段的前七个字符进行比较,请将 [地址] 替换为 Left([地址],7) 函数调用,将 [顾客].[地址] 替换为 Left([顾客].[地址],7) 函数调用。 | ORDER BY 顾客.公司名称, 顾客.地址, 顾客.城市; | 没有更改。 |
- 修改完语句后,单击“运行” 以运行查询并在数据表视图中显示结果。 现在,查询将返回全部四条重复记录,因为现在只需匹配“地址”字段中的前 7 个字符(从左边开始):0 P5 I: f: j) o6 N: i
公司名称 | 地址 | 城市 | 联系人姓名 | 移动电话 | Coho Winery | 3122 75th Ave. S.W. | Seattle | Pica Guido | (206) 555-2124 | Coho Winery | 3122 75th St. S.W | Seattle | Christine Hughes | (206) 555-2125 | Fourth Coffee | Calle Smith 2 | Mexico City | Julian Price | (7) 555-2126 | Fourth Coffee | Calle Smith 2 | Mexico City | Reshma Patel | (7) 555-2233 |
) w; @$ x' T3 {% X/ N& q+ d# u 手动编辑记录- 在数据表视图中打开在上面的步骤中创建的查询。
- 请执行下列操作之一:
- 要编辑某个字段中的值,请选择该字段并输入新值。
- 要删除整条记录(一行),请单击行选择器(行旁边的空框)并按 Delete。 注释 如果找到大量重复记录(以致于您无法手动删除),可以通过创建并运行一个删除查询来删除这些记录。有关创建并运行删除查询所涉及的基本步骤,请参阅本主题后面的使用删除查询删除重复记录一节。
# Z! `/ w/ r( }* A0 @" y1 z/ j2 d有关使用删除查询的更完整信息(包括如何计划删除以及如何更改表关系并删除相关数据),请参阅使用删除查询从数据库中删除一项或多项记录一文。& D% [' }0 l; m# Y" a3 }
返回节首 通过隐藏所有重复记录来显示唯一记录大部分数据库表都包含一个唯一标识每条记录的字段,该字段通常为主键字段。如果您在设计查询时隐藏或省略这些类型的字段,可能会看到看似重复的记录,因为所有返回字段中的值都是匹配的。/ p$ n( F/ y6 |
例如,下图显示的查询结果中有两份订单(位于红色框中)看起来是重复的。3 e/ o7 w& F3 g( O+ {
5 S5 y9 U+ K* ?1 T" S但是,如果查询包括了主键字段(例如订单 ID)或能够唯一标识每条记录的其他字段(例如发货日期),您会发现这些记录并非重复记录。本节中的步骤介绍了如何隐藏查询返回的所有字段中的值均匹配的重复记录。例如,您可以隐藏有关 Antonio Moreno Taqueria 的记录之一,但不能隐藏有关 Blauer See Delikatessen 的记录,因为“地址”字段包含不同的值。 3 f* k. }; W O3 J4 s' o
执行操作时,请记住以下规则:只有当查询结果中的所有字段均包含相同的值时,才会将两条或多条记录视为重复记录。即使有一个字段中的值不同,每条记录也将是唯一记录,因此您不能使用此处介绍的方法隐藏这些记录。如果要隐藏这些类型的重复记录,可以将总计查询与聚合函数(例如 FIRST、MIN、MAX 等等)一起使用。有关执行此操作的信息,请参阅本文后面通过指定在结果中显示哪些重复记录来显示不同的记录一节。" t/ u0 I0 ~9 }* i h
Access 提供了两种仅在查询结果集中显示唯一值的方法:8 x, j9 V7 T2 p6 i; S7 e! g" \' m
- 如果您隐藏了主键字段(或使记录具有唯一性的其他字段),请取消隐藏该列。
- 创建一个选择查询,然后将该查询的“唯一值”属性设置为“是”。当该查询找到重复值时,将仅显示这些重复值中的一个(找到的第一个值),而隐藏其余的重复值。
本节中的步骤介绍了如何使用这两种方法。
2 I3 W8 s. I2 |9 T: r显示隐藏的字段- 在数据表视图中打开查询,在标题行(包含列标题的行)中的任意位置右键单击,然后单击“取消隐藏列”。
- 在“取消隐藏列”对话框中,选中要添加到您的数据表中的每个字段旁边的复选框,然后单击“确定”。
设置“唯一值”属性 注释 将查询的“唯一值”属性设置为“是”后,如果查询处于数据表视图,则您不能编辑字段值或删除数据。要编辑或删除数据,请在数据表视图中打开基础表。
, c$ T8 y7 n/ o$ ^9 R9 t- 在“创建”选项卡上的“其他”组中,单击“查询向导”。
- 在“新建查询”对话框中,单击“简单查询向导”,然后单击“确定”。 如果显示提示消息通知您未安装此功能,请单击“是”安装该向导。
- 在表列表中,选择包含重复记录的表,然后单击“下一步”。
- 在可用字段列表中,仅选择包含重复信息的字段,然后单击“下一步”。
- 在不选择其他任何字段的情况下,再次单击“下一步”。添加其他任何字段可能导致 Access 将某些重复记录视为唯一记录。
- 接受建议的查询名称,或输入您自己的名称,单击“修改查询设计”,然后单击“完成”在设计视图中打开查询。
- 在查询设计器上半部分的空白区域中右键单击,然后单击“属性”。
- 在属性表中,找到“唯一值”属性并将其改为“是”。
- 单击“运行” 以运行查询并在数据表视图中显示结果。如果数据包含重复记录,将仅显示这些记录中的一条。
返回节首 通过指定在结果中显示哪些重复记录来显示不同的记录当有重复记录时,您可能只希望看到不同的值,即:仅显示每组重复记录中的一条记录。要查询某条特定的重复记录,可以使用一种称为总计查询的查询。向总计查询添加字段时,查询会将每个字段视为一个组,并且您可以针对组中的数据运行一类称为聚合函数的函数。这些函数反过来又可以从一组重复记录中返回一条记录。
0 o+ K" u6 K5 E: M您可以通过多种方法对这些数据使用总计查询和聚合函数:$ @7 `+ k& f6 d- d5 t
- 使用 First 函数,仅显示最先输入的记录。
- 使用 Last 函数,仅显示最后输入的记录。
- 使用 Max 或 Min 函数,仅显示特定字段中的值最小或最大的记录。例如,您可以使用 Max 函数显示具有最近日期的记录,或使用 Min 函数显示具有最早日期的记录。 注释 您不能编辑此类查询返回的数据。要编辑或删除数据,请在数据表视图中打开基础表。
1 y1 d; r, L' r B# y' o 本节中的步骤介绍了如何查询原始记录、最近的记录和最早的记录。这些步骤将使用“员工”表。* F4 k5 Q% z% z: v) m& e. m/ K5 h
姓氏 | 名 | 地址 | 城市 | 生日 | 雇佣日期 | Barnhill | Josh | 1 Main St. | New York | 05-Feb-1968 | 10-Jun-1994 | Heloo | Waleed | 52 1st St. | Boston | 22-May-1957 | 22-Nov-1996 | Guido | Pica | 3122 75th Ave. S.W. | Seattle | 11-Nov-1960 | 11-Mar-2000 | Bagel | Jean Philippe | 1 Contoso Blvd. | London | 22-Mar-1964 | 22-Jun-1998 | Price | Julian | Calle Smith 2 | Mexico City | 05-Jun-1972 | 05-Jan-2002 | Hughes | Christine | 3122 75th St. S. | Seattle | 23-Jan-1970 | 23-Apr-1999 | Riley | Steve | 67 Big St. | Tampa | 14-Apr-1964 | 14-Oct-2004 | Birkby | Dana | 2 Nosey Pkwy | Portland | 29-Oct-1959 | 29-Mar-1997 | Bagel | Jean Philippe | 1 Contoso Blvd. | London | 22-Mar-1964 | 20-Jun-1998 | ! j, b0 c6 s' e; r6 z( c
如果要在数据库中使用该表,请参阅本文前面的准备一些示例数据中的步骤。. ~& {9 {3 s2 C7 e/ T# O* }% ]
使用总计查询- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
- 在“显示表”对话框中,双击包含重复数据的表,然后单击“关闭”。 该表将显示在查询设计器的上半部分。
- 仅添加包含重复数据的字段。您可以双击字段或将其从表窗口拖动到设计网格中的“字段”行。 如果使用“员工”示例表,则请添加“姓氏”、“名”和“生日”字段,因为通过这些字段可以确定重复项。
- 添加指定选择条件的字段。 在“员工”示例表中,添加“聘用日期”字段,因为该字段包含对应于同一个员工姓名的两个不同的值。
* z% y% U% R' P 注释 请勿向网格添加其他字段。总计查询只能包括具有重复数据的字段以及包含测试中要使用的数据的另一个字段。 - 在“设计”选项卡上的“显示/隐藏”组中,单击“总计”。设计网格中将显示“总计”行,包含表字段的列中将显示“分组依据”。
- 将所有字段的“总计”行设置保留为“分组依据”,然后单击“运行” 以运行查询并在数据表视图中显示结果。如果使用了上表中的数据,查询将返回两次“Jean Philippe Bagel”,因为这两条重复记录包含不同的聘用日期。
- 返回设计视图,指定从重复项中选择一条记录的条件。要使用示例数据,请按如下所示更改“总计”行中“聘用日期”列中的值。
- 要查看最早的记录,请将值更改为“第一项”。
- 要查看最近输入的记录,请将值更改为“最后一项”。
- 要根据特定字段中的值选择记录,您需要使用 Max 或 Min 函数。在本例中,您需要查看包含最早聘用日期的记录。要执行此操作,请将值更改为 Min。
- 单击“运行” 以运行查询并在数据表视图中显示结果。
如果查询找到所需结果,则可以将其更改为删除查询并运行该查询,以方便快捷地删除重复记录。有关运行删除查询的信息,请参阅本文后面的使用删除查询删除重复记录一节。% g6 k3 I8 X3 a1 i
返回节首 对重复记录使用聚合函数(Count、Sum、Average)除了从一组重复记录中返回某条特定记录以外,您还可以使用聚合函数对重复记录进行计数或汇总一组重复记录的数据。通常,您需要在执行合并或删除重复数据的步骤之前运行这些函数。
0 i- G4 L' V8 W8 l0 g: H您可以通过创建使用 Count、Sum 和 Average 等聚合函数的总计查询,来汇总表中的重复数据。 注释 在数据表视图中查看总计查询时,不能编辑字段值或删除记录。要编辑或删除数据,请在数据表视图中打开基础表。/ {! g) y0 \. H3 j1 ~ U
" v+ j: a+ J: [
本节中的步骤将使用“拥有数量”表。
+ s* H1 o: ]( g# q公司名称 | 联系人姓名 | 地址 | 城市 | 邮政编码 | 移动电话 | 应付金额 | Baldwin Museum of Science | Josh Barnhill | 1 Main St. | New York | 12345 | (505) 555-2122 | $556.78 | Blue Yonder Airlines | Waleed Heloo | 52 1st St. | Boston | 23456 | (104) 555-2123 | $1,893.24 | Coho Winery | Pica Guido | 3122 75th Ave. S.W. | Seattle | 34567 | (206) 555-2124 | $321.79 | Contoso Pharmaceuticals | Jean Philippe Bagel | 1 Contoso Blvd. | London | NS1 EW2 | (171) 555-2125 | £457.68 | Fourth Coffee | Julian Price | Calle Smith 2 | Mexico City | 56789 | (7) 555-2126 | $98.75 | Coho Winery | Christine Hughes | 3122 75th St. S. | Seattle | 34567 | (206) 555-2125 | $321.79 | Humongous Insurance | Steve Riley | 67 Big St. | Tampa | 01234 | (916) 555-2128 | $297.45 | Trey Research | Dana Birkby | 2 Nosey Pkwy | Portland | 43210 | (503) 555-2129 | $509.09 | Fourth Coffee | Reshma Patel | 2 Calle Smith | Mexico City | 56789 | (7) 555-2233 | $98.75 |
9 \3 R+ `; E8 m9 s9 `如果要在数据库中使用该表,请参阅本文前面的准备一些示例数据中的步骤。
! C* O* ?( Q2 f1 g, S( N( ~1 [创建总计查询- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
- 在“显示表”对话框中,双击要在查询中使用的表,或单击“添加”,然后单击“关闭”关闭对话框。如果使用示例数据,请在查询中添加“欠款金额”表。
- 添加包含重复数据的字段。 如果使用“拥有数量”表,请添加“公司名称”和“城市”字段,因为这些字段可以确定重复项。
- 添加提供选择条件的字段。如果使用“欠款金额”表,则请添加“应付金额”字段。
- 在“设计”选项卡上的“显示/隐藏”组中,单击“总计”。设计网格中将显示“总计”行,每个字段的行中将显示“分组依据”。
- 根据您的需要,请执行下列操作之一:
- 要对多条记录进行计数,请选择包含要计数的值的字段,然后在“总计”行中将字段的值更改为“计数”。如果使用示例数据,请将“应付金额”中的值设置为“计数”。
- 要计算总金额,请将字段中的值设置为“求和”。
注释 总计查询只能显示汇总信息,而不能显示单个值。 - 单击“运行” 以运行查询并在数据表视图中显示结果。
返回节首 使用删除查询删除重复记录当您确认某个表包含重复记录后,可以通过创建并运行一个删除查询来删除不需要的数据。创建并运行删除查询的过程通常包含以下主要步骤:
7 m1 G# W7 |) K& b4 e) u; C- 计划删除。在此过程中,您需要确定要删除的数据是否与另一个表中的数据相关。如果是,则需要确定数据是位于一对多关系的“一”端,还是位于一对多关系的“多”端。如果数据位于“一”端,则必须先在关系中启用一个属性,然后才能删除数据。如果数据位于“多”端,则可以创建并运行查询,而无需采取其他操作。您可以使用“关系”工具来检查数据库中的关系。要启动“关系”工具,请在“数据库工具”选项卡的“显示/隐藏”组中,单击“关系”。 有关计划和运行删除查询的详细信息,请参阅使用删除查询从数据库中删除一项或多项记录一文。
- 创建一个查询,例如选择查询或唯一值查询,添加或更改任何条件,直至查询仅返回要删除的数据。
- 将该查询转换为删除查询,然后运行该删除查询来删除不需要的数据。
要点 您不能撤消删除查询的结果。因此,在运行删除查询之前,应当备份数据库。有关备份数据库的信息,请参阅本文前面的备份数据库一节。8 r5 W& D* t5 k/ ?% l
下面的步骤说明了如何创建选择查询,将它转换为删除查询,然后运行删除查询来删除记录。( m: M% F4 O" w5 F( t0 T- |' a+ Y
创建选择查询- 在“创建”选项卡上的“其他”组中,单击“查询设计”。 , _7 F, ^& O0 ~* p- K N
将打开查询设计器,并显示“显示表”对话框。 - 选择处于关系的“一”端的表,单击“添加”,然后单击“关闭”。 该表在查询设计网格的上半部显示为一个窗口。窗口中列出了表中的所有字段。下图显示了查询设计器中的一个典型表。
) p. u/ G+ \- Z$ s2 x1 u* } - 双击星号 (*) 将表中的所有字段添加到设计网格中。 添加所有表字段将使删除查询从表中删除所有记录(行)。
- (可选)添加允许您输入条件的列。 例如,假设某个客户停业了,您需要删除该客户的所有未结订单。若要仅找出这些记录,可以向设计网格中添加“客户 ID”和“订购日期”字段。
- 如果您执行了上一个步骤,请在设计网格的“条件”行中输入您的条件。 必须使用条件,以便仅返回要删除的记录。否则,删除查询将删除表中的所有记录。要继续完成上一步中的示例,请输入已停业的客户的 ID 号,以及该客户的订单失效日期。5 Z' R" M. z7 e' L+ Q
有关如何使用条件的详细信息,请参阅使用删除查询从数据库中删除一项或多项记录一文。 - 如果您执行了上一个步骤,请清除每个条件字段的“显示”复选框。
- 在“设计”选项卡上的“结果”组中,单击“运行”。 验证查询是否返回要删除的记录。
- 将查询保持打开状态,然后继续执行下面的步骤。
将选择查询转换为删除查询并运行该查询以删除数据- 单击“设计视图”,从数据表切换到查询设计器。
- 在“设计”选项卡上的“查询类型”组中,单击“删除”。 Access 将选择查询更改为删除查询,在设计网格的下半部隐藏“显示”行,并添加“删除”行。
$ ^) J9 L u9 K _请确保“*”(所有字段)列中的“删除”行显示“From”。“Where”一词应显示在所有条件列中。 - 确认要删除这些数据,然后单击“运行” 以运行查询并在数据表视图中查看结果。 Access 将提示您确认删除。
; K* X) |3 e5 p) U; K" k1 _单击“是”删除数据。 隐藏确认消息如果不想在每次运行删除查询或其他动作查询时都看到确认消息,请执行以下步骤。: X9 [5 e2 Q! n5 q0 M/ S
- 单击“Microsoft Office 按钮”,然后单击“访问选项”。 出现“Access 选项”对话框。
- 单击“高级”,然后在“编辑”部分中的“确认”下,清除“动作查询”复选框。
- 单击“确定”关闭“Access 选项”对话框。
返回节首 禁止用户输入重复值您可以实施多条规则来防止用户输入重复数据:
8 C; X) `, \) |7 m- 将字段设置为仅包含唯一值。 要实施此规则,请执行下列操作之一:
- 将该字段指定为主键。只有当表中尚不包含主键时,才能执行此操作。要将字段设置为主键,请在设计视图中打开表,右键单击字段名,然后单击“主键”。主键字段仅接受唯一值,如果用户输入重复值,该字段将提示用户。
- 如果表中已经有主键,则请在表的设计视图中将该字段的“索引”属性设置为“有(无重复)”。此属性将禁止该字段对多条记录接受相同的值。请记住,在某些情况下(例如包含名称和城市信息的字段),您必须接受重复值。
- 指定每条记录的两个或更多个字段中的值组合必须是唯一的。 例如,假设您有一个包含联系人数据的表。您可以将“联系人姓名”、“地址”、“城市”等字段的组合指定为表的主键。 这种方法很有效,因为出现两个联系人不但姓名相同而且地址和所在城市也相同的可能性微乎其微。
6 h) [( T! |% ] [, F要创建多字段主键,请执行以下步骤:
, j7 W5 w5 B( P. L- 在设计视图中打开表。
- 单击第一个字段左侧的行选择器选中整行。
- 按住 Ctrl,单击要包括在主键中的其他所有字段的行选择器。
- 单击鼠标右键,然后单击快捷菜单中的“主键”。
此步骤会将主键中每个字段的“索引”属性设置为“有(有重复)”,以便您可以在多条记录中输入相同的姓名、地址或城市,但您不能在多条记录中输入完全相同的姓名、地址和城市组合。例如,您可以有两个名为费英博并且居住在玉林街 2345 号的联系人,但他们不能都居住在昆明。
1 _$ {2 i$ ]" ?( N) R$ T 返回节首 返回页首
' _: u. I: [7 B& a. k+ f. R! V在多个表中查找和编辑、隐藏或删除重复数据以下各节中的信息介绍了一些方法,您可以用这些方法来查找并编辑、隐藏或删除存在于多个表中的重复记录。通常,当您尝试将一个数据库与另一个数据库集成时,就会出现两个或多个表中的数据重叠的现象。
5 }, i* R+ U) a9 h2 E I
+ k6 w2 G& y! b# h当两个表中存在重复值时,使这些值相邻显示您可能经常会遇到同一数据库的两个表中包含重复或重叠数据的情况。例如,假定您有一个“客户”表和一个“顾客”表:
$ Y& N: B1 N$ w1 h* c/ ]) Y; Q“客户”表 3 C- y w8 C6 P
名称 | 地址 | 城市 | 移动电话 | 传真 | Baldwin Museum of Science | 1 Main St. | New York | (505) 555-2122 | (505) 555-3123 | Blue Yonder Airlines | 52 1st St. | Boston | (104) 555-2123 | (104) 555-2124 | Coho Winery | 3122 75th Ave. S.W. | Seattle | (206) 555-2124 | (206) 555-2125 | Contoso Pharmaceuticals | 1 Contoso Blvd. | London | (171) 555-2125 | (171) 555-2126 | Fourth Coffee | Calle Smith 2 | Mexico City | (7) 555-2126 | (7) 555-2127 | Consolidated Messenger | 3122 75th St. S. | Seattle | (206) 555-2125 | (206) 555-2129 | Graphic Design Institute | 67 Big St. | Tampa | (916) 555-2128 | (916) 555-2128 | Litware, Inc. | 3 Microsoft Way | Portland | (503) 555-2129 | (503) 555-2110 | Tailspin Toys | 4 Microsoft Way | Portland | (503) 555-2233 | (503) 555-2239 |
% u' f- V3 X/ w" `5 ^/ X) d0 B“顾客”表 e+ i6 p" {8 ?1 g# I& d3 \
公司名称 | 联系人姓名 | 地址 | 城市 | 邮政编码 | 电话 | Baldwin Museum of Science | Josh Barnhill | 1 Main St. | New York | 12345 | (505) 555-2122 | Blue Yonder Airlines | Waleed Heloo | 52 1st St. | Boston | 23456 | (104) 555-2123 | Coho Winery | Pica Guido | 3122 75th Ave. S.W. | Seattle | 34567 | (206) 555-2124 | Contoso Pharmaceuticals | Jean Philippe Bagel | 1 Contoso Blvd. | London | NS1 EW2 | (171) 555-2125 | Fourth Coffee | Julian Price | Calle Smith 2 | Mexico City | 56789 | (7) 555-2126 | Adventure Works | Christine Hughes | 3122 87th Way S.W. | Seattle | 34567 | (206) 555-2125 | Humongous Insurance | Steve Riley | 67 Big St. | Tampa | 01234 | (916) 555-2128 | Trey Research | Dana Birkby | 2 Nosey Pkwy | Portland | 43210 | (503) 555-2129 | Fabrikam, Inc. | Jesper Aaberg | 9 Empire Way | Seattle | 56789 | (206) 555-2233 |
8 O: I; j6 s, O# _( r; J请注意,在此例中,单个表并不包含重复值,但两个表中的字段包含某些重叠值,例如“客户”表中的“名称”字段中的数据与“顾客”表中“公司名称”字段中的数据。
$ O% a4 e& c( k4 ` H" z您不能总是通过合并两个表来集成每个表中的数据。对于某些客户,“顾客”表中可能包含其最新信息,但“客户”表中可能包含其他用户的最新数据。通常,最好的做法是查看两个表中的内容,然后决定保留哪些数据以及删除哪些数据。! u& ~5 O6 A* q' K8 y( x" z9 r) d
要将两个表中的记录合并到一起,您需要创建一个联合查询。该查询会将重复记录放在一起以便于查看。 注释 您不能编辑或删除联合查询所返回的数据。要编辑或删除数据,请在数据表视图中打开基础表。
+ S/ g. S' f& q: |* i
- h1 b L% X- v' M) c# v- 在“创建”选项卡上的“其他”组中,单击“查询设计”。 " @- `; G" i4 K
Access 将创建一个新查询。将显示“显示表”对话框。 - 关闭“显示表”对话框,而不向设计网格添加任何表或查询。
- 右键单击查询的文档选项卡,然后单击“SQL 视图”。
- 如果使用了前面的表作为示例,请将下面的 SQL 语句粘贴到窗口中。如果使用您自己的数据,则请使用以下语句作为指导。使用显示的 SELECT、UNION ALL SELECT 和 ORDER BY 子句,但将字段和表名称替换为您自己的数据。
% t, Q- X& ~5 D. e nSELECT [公司名称], [地址], [城市], [电话], FROM [顾客]
9 ~- \( f" B- G0 S9 c/ ZUNION ALL SELECT [Name], [地址], [城市], [移动电话], FROM [客户]
}; x7 u8 E; A% B3 fORDER BY [公司名称];
$ c3 q- ?/ R- t9 e! e, U. L% C+ B/ L ^& M, e9 @
第一个 SELECT 语句从“顾客”表中检索记录,第二个 SELECT 语句从“客户”表中检索记录。UNION ALL 子句将两个表中的所有记录组合在一起。ORDER BY 语句对记录进行排序,这样重复记录将放在一起,从而方便查看。3 Y. u, I! C( D4 \2 n% |' O
注释 每个 SELECT 语句必须以相同的顺序返回相同数目的字段。对应的字段必须具有兼容的数据类型,但以下情况除外:您可以将一个“数字”字段和一个“文本”字段用作对应字段。此外还请记住,字段可以具有不同的名称。 - 单击“运行” 以运行查询并在数据表视图中查看结果。 如果您使用上表中的记录,该视图将显示 18 条记录,其中 9 条记录来自“顾客”表,另外 9 条来自“客户”表。 0 I+ h: J# d2 W2 l
保存查询,然后关闭视图。在下一节中将用到此查询。 ^# H) z: R: ]* E+ j3 z
返回节首 当两个表中存在重复值时,仅显示一条记录有时候,您可能只需要查看两个相似表中的不同记录。如果某条记录同时存在于两个表中,您可以包括来自第一个表的记录而忽略第二个表中的对应记录。: Y# g! X5 s& m8 z7 V- X
只有当所有选定字段中的值都匹配时,Access 才会将来自不同表的记录视为重复记录。例如,如果您在查询中包括“公司名称”、“城市”、“地址”、“移动电话”和“传真”字段,则只有当全部五个字段中的值都匹配时,Access 才会将记录视为重复记录。9 ^) z* @! W% j3 d' O9 p/ C/ u/ Z0 T
本节中的步骤说明了如何更改前一节中的查询,以显示“顾客”表中的所有记录,而仅显示“客户”表中具有唯一性的记录。/ {, k: K# m- i; G: |
注释 您不能编辑联合查询返回的数据。要编辑或删除数据,请在数据表视图中打开基础表。
/ `2 J& U6 ?( k5 J" J" f& x( J8 T修改查询- 打开在前一节中创建的查询。
- 在查询的文档选项卡上,单击“SQL 视图”查看 SQL 语句。
- 从两个 SELECT 语句中删除 [电话] 和 [移动电话] 字段。
- 删除单词 UNION 后面的单词 ALL。这样做可以使查询忽略来自“客户”表的重复记录。SQL 语句将类似于下面的内容。 SELECT [公司名称], [地址], [城市], FROM [顾客]
2 Q; t2 H( E) b1 LUNION SELECT [Name], [地址], [城市], FROM [客户]
; K' D4 F( U/ b" b! ?ORDER BY [公司名称]; - 单击“运行” 以运行查询并在数据表视图中查看结果。 如果使用前一节中的示例数据,查询将返回 14 条记录,而不是 18 条。
$ @( F; n! k* E+ v0 w# c 返回节首 仅显示同时在两个表中找到的重复记录如果只需要查询两个表中都存在的匹配值,可以使用内部联接。如果您是 Access 新手,那么只需记住,内部联接是一个操作,只有当联接字段中的值匹配时,该操作才会链接两个或更多个表中的行。0 N& O u4 [+ D# B3 ^
您可以通过创建一个同时包括两个表的选择查询,然后在包含重复值的字段之间建立一种关系,来创建内部联接。默认情况下,Access 会在您创建关系时建立内部联接。3 K; P, e5 O" R, d6 n3 S7 w
注释 您不能编辑由包含内部联接的选择查询返回的字段或行。如果要编辑数据,请打开基础表并更改每个表中的值。
) V0 i0 G# i. _0 b& x) i3 ?0 ~
Y5 p' \( t; ?& f; J; C4 }创建包含内部联接的查询- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
- 在“显示表”对话框中,双击“顾客”表和“客户”表,然后单击“关闭”关闭对话框。
- 确定包含重复记录中的匹配值的字段。如果使用示例表,则“顾客”表中的“公司名称”字段将与“客户”表中的“名称”字段对应。
- 将第一个表的“公司名称”字段拖动到第二个表的“名称”字段。Access 将用一条线来连接这两个字段。 5 i; |# }# d8 f
默认情况下,查询在两个表之间建立一个内部联接。内部联接仅选择“公司名称”字段与“名称”字段匹配的那些记录。 - 双击“公司名称”字段将其添加到查询设计网格中。此字段可以帮助您确定数据表视图中的记录。
- 在“顾客”表和“客户”表中双击您需要的其他字段,将其添加到查询设计网格中。在本例中,请添加“顾客”表中的“移动电话”字段和“客户”表中的“电话”字段。
- 单击“运行” 以运行查询并在数据表视图中查看结果。查询将返回 5 条记录,分别对应于在两个表中都有记录的一个客户。 . N- V2 ?8 P; _) j6 a5 u$ R( j, _( b
公司名称 | 电话(顾客) | 移动电话(客户) | Baldwin Museum of Science | (505) 555-2122 | (505) 555-3123 | Blue Yonder Airlines | (104) 555-2123 | (104) 555-2124 | Coho Winery | (206) 555-2124 | (206) 555-2124 | Contoso Pharmaceuticals | (171) 555-2125 | (171) 555-2125 | Fourth Coffee | (7) 555-2126 | (7) 555-2126 |
0 ^9 n1 l, w+ M+ t D# ]- z/ ~+ h) L# A5 r
返回节首 仅查看一个表中在另一个表中没有匹配项的记录让我们继续讨论“顾客”表和“客户”表中包含重复数据的情况,现在,您将看到需要执行什么操作才能查看“顾客”表中在“客户”表中没有重复记录的那些记录。这可以帮助您在合并两个表之前,仅根据“顾客”表中的内容来针对某些客户制定决策。
2 H% m% g( R2 S, k; g通过创建查找不匹配项查询,可以仅查看“顾客”表中在“客户”表中没有匹配项的记录。这类查询使用示例数据检索“顾客”表中在“客户”表中没有匹配项的所有记录。$ K! \& O- G7 j; U' T) P
注释 在数据表视图中查看此查询时,可以编辑字段值或删除记录。
' C) D; z* \" J, b0 y+ x" [
; b$ a' [2 m. |创建查找不匹配项查询- 在“创建”选项卡上的“其他”组中,单击“查询向导”。
- 在“新建查询”对话框中,单击“查找不匹配项查询向导”,然后单击“确定”。
- 单击“顾客”表 - 该表包含您感兴趣的记录。单击“下一步”。
- 单击“客户”表 - 该表是要与“顾客”表进行比较的表。单击“下一步” 。
- 单击“顾客”表中的“公司名称”字段,单击“客户”表中的“名称”字段,然后单击“<=>”按钮。此操作将根据客户名称来联接表。单击“下一步”。
- 选择要在视图中显示的字段。在本例中,请添加“公司名称”、“地址”、“城市”和“移动电话”字段。单击“下一步”。
- 为查询键入一个名称,然后单击“完成”以在数据表视图中查看记录。如果您使用示例表,查询将返回 4 条记录;在本例中,将返回“顾客”表中的在“客户”表中没有重叠记录的记录。
7 O1 K, G2 {4 M' C. z; h/ Q8 n2 F公司名称 | 地址 | 城市 | 电话 | Adventure Works | 3122 87th Way S.W. | Seattle | (206) 555-2125 | Humongous Insurance | 67 Big St. | Tampa | (916) 555-2128 | Trey Research | 2 Nosey Pkwy | Portland | (503) 555-2129 | Fabrikam, Inc. | 9 Empire Way | Seattle | (206) 555-2233 | 4 R0 k. m! n" c- d/ I9 Y
) J6 v' j% V. v3 p) V9 Q 返回节首 从一个表中删除重复记录并将其余记录合并到另一个表中检查相似表中的重复数据后,可以删除重复记录并将其余数据合并到一个表中。该过程包括以下主要步骤:3 E% E; }/ X3 r) I* W& U
- (可选)在要删除的表中更新要合并的任何数据。关于如何更新数据的说明超出了本主题的范畴。 有关如何更新数据的信息,请参阅更新数据库中的数据一文。
- (可选)检查要删除的表与数据库中的其他表之间可能存在的任何关系。如果存在关系,您通常可以删除该关系,然后建立与另一个表(包含合并数据的表)的新关系。但您需要确保新表中的主键值与其他表中的主键值匹配。
- 创建使用“唯一值”属性的删除查询,以查找和删除所有匹配记录。在此过程中,必须确保没有破坏数据库中各个表之间的关系。例如,假定您需要将“客户”表中具有唯一性的记录移至“顾客”表,然后删除“客户”表。如果“客户”表与数据库中的其他表相关,则必须执行相应的操作来确保“顾客”表接受这些关系。关系的全面说明超出了本主题的范畴。 有关详细信息,请参阅创建、编辑或删除关系一文。
- 创建一个追加查询,将要删除的表中的其余记录添加到要保留的表中。在此过程中,您可能需要将追加数据的主键字段和值添加到要保留的表中。
- 删除不需要的表。
本节中的步骤介绍了如何创建和使用删除查询和追加查询,以及如何删除表。这些步骤会用到“顾客”表和“客户”表。, I4 k( _$ B- e5 i! u2 G0 J
“顾客”表 # S8 \4 ]% V# ^4 Q0 N
公司名称 | 联系人姓名 | 地址 | 城市 | 邮政编码 | 电话 | Baldwin Museum of Science | Josh Barnhill | 1 Main St. | New York | 12345 | (505) 555-2122 | Blue Yonder Airlines | Waleed Heloo | 52 1st St. | Boston | 23456 | (104) 555-2123 | Coho Winery | Pica Guido | 3122 75th Ave. S.W. | Seattle | 34567 | (206) 555-2124 | Contoso Pharmaceuticals | Jean Philippe Bagel | 1 Contoso Blvd. | London | NS1 EW2 | (171) 555-2125 | Fourth Coffee | Julian Price | Calle Smith 2 | Mexico City | 56789 | (7) 555-2126 | Adventure Works | Christine Hughes | 3122 87th Way S.W. | Seattle | 34567 | (206) 555-2125 | Humongous Insurance | Steve Riley | 67 Big St. | Tampa | 01234 | (916) 555-2128 | Trey Research | Dana Birkby | 2 Nosey Pkwy | Portland | 43210 | (503) 555-2129 | Fabrikam, Inc. | Jesper Aaberg | 9 Empire Way | Seattle | 56789 | (206) 555-2233 |
: \8 K% J' B, t# F3 Q+ w1 K% g“客户”表
4 [. i8 Z! w# F3 A R! W名称 | 地址 | 城市 | 移动电话 | 传真 | Baldwin Museum of Science | 1 Main St. | New York | (505) 555-2122 | (505) 555-3123 | Blue Yonder Airlines | 52 1st St. | Boston | (104) 555-2123 | (104) 555-2124 | Coho Winery | 3122 75th Ave. S.W. | Seattle | (206) 555-2124 | (206) 555-2125 | Contoso Pharmaceuticals | 1 Contoso Blvd. | London | (171) 555-2125 | (171) 555-2126 | Fourth Coffee | Calle Smith 2 | Mexico City | (7) 555-2126 | (7) 555-2127 | Consolidated Messenger | 3122 75th St. S. | Seattle | (206) 555-0170 | (206) 555-0171 | Graphic Design Institute | 67 Big St. | Tampa | (916) 555-2128 | (916) 555-2128 | Litware, Inc. | 3 Microsoft Way | Portland | (503) 555-0192 | (503) 555-0193 | Tailspin Toys | 4 Microsoft Way | Portland | (503) 555-2233 | (503) 555-2239 | ; i9 u* U, y7 _5 V4 P! c9 ~
如果要在数据库中使用这些表,请参阅本文前面的准备一些示例数据。在本练习中,我们假设“客户”表包含最新信息 - 因此,您需要删除“顾客”表中的匹配记录,然后将“顾客”表中的其余记录合并到“客户”表中。
# y! `9 q- W/ b5 x6 u0 U删除不需要的数据- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
- 在“显示表”对话框中,双击“客户”表和“顾客”表,然后关闭对话框。
- 将“客户”表中的“公司名称”字段拖动到“顾客”表中的“名称”字段,将两个表联接起来。
- 右键单击窗口上半部分的空白区域,然后单击“属性”。将“唯一的记录”属性的值设为“是”。 通过联接这两个表并将查询的“唯一的记录”属性设置为“是”,可以避免在运行查询时系统显示“无法从指定的数据表中删除”消息。
- 在“设计”选项卡上的“查询类型”组中,单击“删除”。
- 将“客户”表中的星号 (*) 拖动到查询设计网格中第一列的“字段”行。 7 I, c% t! x& Z# _3 D4 n" m
“客户”将显示在“表”行,“自”将显示在“删除”行。这意味着查询将删除“客户”表中的行。 - 现在,您需要指定查询应删除的记录。如果使用示例表,则可以通过删除“客户”表中“名称”、“地址”和“城市”字段值与“顾客”表中的对应字段值匹配的记录,来执行此操作。 将“客户”表中的“名称”字段拖动到查询设计网格中“字段”行的第一个空白单元格。对“客户”表中的“地址”和“城市”字段执行相同的操作。
- 如果使用示例字段,请在“名称”字段的“条件”行中,键入 [顾客].[CompanyName]。在“地址”字段的“条件”行中,键入[顾客].[地址]。在“城市”字段的“条件”行中,键入 [顾客].[城市]。您的查询设计网格将如下所示:( J' \/ f% ]( }3 }
! w; b' c5 [' f$ E" o3 o运行查询时,将删除符合查询中的条件的所有记录,即那些在每个表的上述三个字段中包含匹配值的记录。 - 单击“查看”,预览运行查询时将删除的记录。您将看到“客户”表中的 5 条重复记录。
- 单击“运行” 以运行查询。当系统要求您确认删除时,单击“是”。
- 继续下面的步骤创建追加查询。
追加其余数据- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
- 在“显示表”对话框中,双击源表,再双击包含要追加的记录的表,然后单击“关闭”。如果使用示例表,请双击“顾客”表。
- 在“设计”选项卡上的“查询类型”组中,单击“附加”。
- 在“追加”对话框的“表名称”列表中,选择目标表(要在其中追加数据的表)。如果使用示例表,请选择“客户”表,然后单击“关闭”。
- 将要追加的字段从源表移动到设计网格的“字段”行。 要点 仅移动在目标表中具有对应字段的那些字段。
' T6 D% Z9 ?( g如果使用示例数据,请移动“名称”、“地址”和“移动电话”字段。 - 单击每个字段中的追加到行,并选择目标表中对应字段的名称。如果使用示例数据,请分别选择“顾客名称”、“地址”和“电话”字段。
- 由于您要将“客户”表中的所有记录添加到“顾客”表中,因此您无需指定任何条件。单击“查看”,预览运行查询时将添加到“顾客”表中的记录。
- 保存并关闭视图。
- 找到并双击追加查询。单击“是”确认追加操作。 我不想在每次运行此查询时都看到确认消息
5 F' P+ C; `* u- o0 Y- 单击“Microsoft Office 按钮”,然后单击“访问选项”。
- 在“Access 选项”对话框中,单击“高级”。
- 在“编辑”部分的“确认”下,清除“动作查询”复选框。
删除表- 确保满足以下条件:您具有删除数据库中的表的必要权限,数据库不是只读数据库,并且没有其他用户打开表。
- 在导航窗格中,单击要删除的表。
- 按 Delete,然后单击“是”确认要删除该表。 注释 删除数据库表可能会破坏数据库的部分或全部功能。因此,您在计划删除时必须确保数据库仍然可以正常工作,并在删除数据或其他组件之前始终先备份数据库。
0 p2 V: H. q' {有关删除数据的详细信息,请参阅从数据库中删除一项或多项记录一文。& r6 w3 r g, \
返回节首 查看相关表中的数据时仅显示各不相同的记录将两个相关表中的数据组合在一起的查询可能会显示所有字段看似匹配的记录。但是,如果您仔细查看这些表,则可能会发现这些表实际上并不包含重复记录。如果查询不包含能够唯一标识每条记录的特定字段(如主键字段),就会出现这种问题。在这种情况下,您不需要删除这些记录,但可以采取措施来隐藏看似重复的记录。
& d5 h" @; U1 m3 D) H- j+ d8 Y例如,假定您使用查询将两个表中的客户订货数据集中在一起,以确保员工能够按时填写订单。客户可能在一份订单中订购多种产品,每种产品在基础表中显示为一条单独的记录(行)。由于订单是在同一天下达的,又是在同一天发货的,因此指定订单的记录可能会包含大量重复日期,例如:1 a9 `6 A; y" T$ c0 ~+ E
, Y; i+ H! v* f. v) [* d
由于您知道订单货物将在指定日期到达,并将在指定日期发运这些订单货物,因此您只需要查看每份订单中的一条记录(行)即可。要显示包含订单数据的表中的唯一性记录,可以将查询的“唯一的记录”属性设置为“是”。如果将该属性设置为“是”,查询将查找表中的所有行,找到匹配行(不仅仅是匹配字段)时,查询将仅在结果集中显示这些重复行中的一行。* k( |( S! F) W
将“唯一的记录”属性设置为“是”- 在设计视图中打开查询,按 F4 显示属性表。
- 在属性表中,将“唯一的记录”属性设置为“是”,然后关闭属性表。
7 |3 A+ Y1 A4 |( f3 d; A( W0 n# f7 o 执行操作时,请记住:将“唯一的记录”属性设置为“是”时,查询将比较所有行,只有当涉及的所有表中的行都匹配时,查询才会排除数据。并且,只有当查询包含两个或多个表时,您才可以使用“唯一的记录”属性。. _; b# |) u4 G& b. [
当切换到数据表视图时,将仅看到每份订单的一条记录。8 h" p) Z8 e) V. c. U. L
j, Q V" D2 j e8 V, N' x* W) H另外还请记住:当您将“唯一的记录”属性设置为“是”并运行查询时,可能仍然会看到看似重复的记录。继续以前面的示例为例,您可能仍然会看到具有匹配的订购日期和发货日期的记录,例如:3 v0 W1 E6 k( t1 d
0 g2 C& ^1 h# P! Y8 h; D2 F* [( l+ L
% a- f! y5 g( Z1 K- {# {如果您在同一天收到两份不同的订单,然后又在同一天发运这两份订单的货物,就会出现这种情况。在这种情况下,将“唯一的记录”属性设置为“是”将不会在查询结果中隐藏此类记录,因为这些记录在基础表中并不是真正的重复记录。0 _! A. x5 S/ y! ?% ]
如果您只想查看此类记录的一个实例(即:每天一条订单记录),则需要将查询的“唯一值”属性设置为“是”。将“唯一值”属性设置为“是”后,查询将不会在基础表中查找重复值,而是查看您指定的字段中的值;如果两条记录的所有字段均匹配,查询将从视图中隐藏其中一条记录。6 J# h6 f: e' n1 d$ o' H
设置“唯一值”属性的方法与设置“唯一的记录”属性的方法相同 - 显示查询的属性表并将设置更改为“是”。在属性表中,“唯一值”属性框位于“唯一的记录”属性框上面。
- `- N2 s/ W; O0 l/ V3 t) F
m3 Z- x- ]) O0 {5 o/ `7 L, T继续以前面的示例为例,现在,您将只能看到接收或发运一份或多份订单的日期,而看不到为每份订单显示一条记录。
% `: }; E- @4 I9 j. B1 z5 ~2 g8 _6 B/ }
! ]: A% [ x+ f! [9 {
注释 由于将“唯一的记录”属性设置为“是”适用于表中向查询提供数据的行,而将“唯一值”属性设置为“是”仅适用于查询中的字段,因此不能同时使用这两个属性。如果将其中一个设置为“是”,Access 会自动将另一个属性设置为“否”。但您也可以将两个属性均设置为“否”以返回所有记录。
6 j; _1 }$ \8 J) q# _8 R8 k* ~下表提供了一个摘要,以帮助您在查询中为“唯一的记录”属性和“唯一值”属性选择设置。
p/ u* X8 P6 @+ h如果您的查询基于... | 并且您想... | 设置... | 结果... | 两个或多个表,但所有查询字段均来自一个表 | 查看表中的不同记录(对于表中的两条记录而言,只有当其中的所有字段都匹配时,才会被视为重复记录) | 将“唯一的记录”设置为“是”(Access 会自动将“唯一值”设置为“否”)。 | 如果表包含重复记录,查询将忽略这些重复记录。但如果查询不包括能够唯一标识记录的字段,则查询结果仍有可能会显示所有字段均匹配的记录。 | 一个或多个表 | 在查询的数据表视图中查看不同的记录(对于两条记录而言,只有当数据表视图中的所有字段都匹配时,才会被视为重复记录) | 将“唯一值”设置为“是”(Access 会自动将“唯一的记录”属性设置为“否”)。 | 查询将在数据表视图中排除重复记录(其中的所有字段均匹配)。但请记住,您可能看不到基础表中的所有不同记录。 | 一个或多个表 | 所有记录 | 将“唯一值”设置为“否”,将“唯一的记录”设置为“否”。 | 您将看到两个表中的所有唯一性记录和重复记录。 |
; q, {- z4 r7 S8 W, S( q返回节首 查看相关表中的特定记录或汇总重复数据查看相关表中的重复数据时,您可能希望在重复数据集中查看某条特定记录,或者希望使用 Count、Sum 或其他聚合函数之一来汇总重复数据。% K: e0 }; p6 D1 T3 Z1 U/ e J
与上一节介绍的情况相似,您的表中可能并不包含真正的重复数据,但当您查看共享一对多关系的两个表(例如“订单”表和“订购明细”表)中的数据时,可能会找到多条包含多个匹配字段的记录。例如,员工可能收到了来自同一客户的多份订单,或者该员工可能在同一天对照不同订单售出了同一产品,等等。如果您要查找相关数据以回答如下所示的询问,则需要对数据进行汇总而不是删除重复数据。
5 I9 b5 [* a1 q" a0 Q# R4 o- 查找每个员工售出的每种产品的总数。
- 计算每个员工针对每个客户处理的订单的总数。
- 查找每个员工当天处理的最大订单。
要汇总数据,可以使用与本文前面的通过指定在结果中显示哪些重复记录来显示不同的记录一节中讨论的查询类似的总计查询。要创建包含多个表的总计查询,请执行以下操作:) g" L* b* T4 M3 Z
- 在“显示表”对话框中添加第一个表,然后记住添加第二个表。
- 添加确定重复项的字段时,从任意一个表中拖动所需要的字段,并针对所有字段将列的“总计”行中的值设置为“分组依据”。
- 确定要显示的记录的字段或包含要汇总的值的字段可以来自两个表中的任意一个。
|
|