第10章Access创建多表查询和交叉表查询.doc_第1页
第10章Access创建多表查询和交叉表查询.doc_第2页
第10章Access创建多表查询和交叉表查询.doc_第3页
第10章Access创建多表查询和交叉表查询.doc_第4页
第10章Access创建多表查询和交叉表查询.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章创建多表查询和交叉表查询本章要点 介绍表的连接 使表的所有字段可访问 连接表以创建多表查询 在多个记录上计算 使用表中的查找字段 设计参数查询 向表或者查询添加子数据表 创建交叉表查询 外连接、自连接和t h e t a连接 从其他数据库中的表创建查询 用查询更新表数据 疑难解答10.1 介绍表的连接获取A c c e s s的目的无疑是为了利用其关系数据库管理能力。为此,你必须能够基于具有相同值的关键字字段链接相关的表这个过程在数据库术语当中称之为连接。第8章“设计Access 查询”和第9章“理解查询操作符和表达式”向你展示了如何创建基于单个表的简单查询。如果你曾试着运行了第9章中的例子,那么你可以算是已经见过多表查询了。当创建查询测试表达式时,你曾将Order Details表连接到O r d e r s表,然后将O r d e r s表连接到C u s t o m e r s表。本章的第一部分专门讨论从通过连接关联在一起的多个表创建的查询。本章提供了使用在查询设计视图中创建的四种基本连接类型的各种查询的例子,这四种连接为等值连接、外连接、自连接和t h e t a连接。但是,注意有两种查询类型无法在A c c e s s的“查询设计”窗口中创建:联合查询和基于表的子查询。要创建这些查询类型,必须编写S Q L语句这是第2 3章“结构化查询语言”中的主题。本章中的某些示例查询使用的是在第4章“A c c e s s数据库和表”中创建的Personnel Actions表。如果你没有创建Personnel Actions表,则可以参考第4章“创建Personnel Actions表”一节中关于如何建立或者导入该表的指导。其他的示例查询建立在前面章节创建的查询之上。因此,你将发现,按照查询在本章的出现顺序,顺序地阅读本章和创建示例查询,将比采用随机的方法更为高效一些。本章还描述了可以用A c c e s s创建的五种查询中的四种和它们的一些例子,四种查询为:选择、合计、参数和交叉表查询。操作类的四种查询类型可以用来创建或者修改表中的数据:创建、追加、删除和更新。第11章“用操作查询修改数据”中提供了每种操作查询类型的典型应用和它们各自的一些例子。如下的Access 2000新特征适用于本章的主题内容: 新的查询属性子数据表名称、链接子字段、链接主字段、子数据表高度和子数据表扩展可以在查询结果集中容纳子数据表。 现在已经可以打印“关系”窗口的内容当“关系”窗口拥有焦点时,选择“文件”,“打印关系”,从“关系”窗口的内容创建一个报表,然后在“打印预览”模式显示该报表,之后便可以打印出该报表。 将关系图表以“报表快照”格式作为电子邮件的一个附件进行发送接收者必须安装有第10章创建多表查询和交叉表查询215Access 2000或者“报表快照”阅读器。10.2 连接表以创建多表查询在创建表之间的连接之前,必须知道哪些或哪个字段具有相同的值,可以建立相关关系。正如在第4章中曾提到的,在包含相关数据的不同表中,为主键和外部键指定相同的名称是一个常见的设计习惯。M i c r o s o f t在创建Northwind 示例数据库时也使用了这种方法,使得在确定表之间的关系和创建表之间的连接时显得更为容易。例如, C u s t o m e r s表的C u s t o m e r I D字段和O r d e r s表的C u s t o m e r I D字段用于将订单和顾客建立连接。图1 0 - 1给出了N o r t h w i n d数据库的结构,用图形方式显示了表之间的连接。A c c e s s查询设计表示连接的方法为在不同表的字段名之间连以线段。粗体指示的是主键字段。通常每个连接至少涉及到一个主键字段。图10-1 Northwind 示例数据库中表之间的连接显示Access 2000Northwind数据库表之间的连接结构时,首先使“数据库”窗口具有焦点(按下F 11 ),然后单击工具栏上的“关系”按钮或者选择“工具”、“关系”。图1 0 - 1中显示两表之间连接的线段上的1指示的是一对多关系中“一”的一方;无穷大符号() 指示“多”的一方。在Access 2000中,可以只显示某个表的直接关系(使用工具栏上的“显示直接关系”按钮)或者数据库所有表之间的关系(“显示所有关系”按钮)。在默认情况下N o r t h w i n d . m d b的所有表,当打开Northwind 示例数据库的“关系”窗口时将全部显示出来。这时,单击“显示直接关系”按钮将不起作用。提示只显示某个表的关系时,可单击工具栏的“清除布局”按钮,单击“显示表”按钮,显示“显示表”对话框,在“表”列表中选择要显示的表,然后单击“添加”并“关闭”该对话框。单击“显示直接关系”按钮,显示所选表的关系。清除“关系”窗口的布局不会对后台表之间的关系产生任何影响。“显示直接关系”的特征主要用于包含许多相关表的数据库。A c c e s s在“查询设计”窗口中支持四种类型的连接: 等值连接(也叫做内连接)是创建选择查询时最为常见的连接。等值连接显示某表中的全部记录与另一个表中相应记录。记录之间的对应关系是由连接表的字段中相同的值决定的( S Q L语句:WHERE field1 = field2 )。在大多数情况下,连接都是基于某个表中唯一的主键字段和一对多关系中其他表的外部键字段来完成的。如果担当关系中多方的表中没有记录的字段值与一方表中的记录相对应,则一方中相应的记录将不会出现在查询结果中。如果两个表之间共同的字段名称所对应的字段为其中某个表的主键, A c c e s s将自动地创建表之间的连接。如果在前面曾在关系窗口中指定过表之间的关系,这些连接也会自动地创建。216 第二部分最大限度地利用查询 外连接可以用于数据库维护,通过创建一个包含具有唯一值记录的新表,从表中删除孤立记录和复制数据。外连接不管在连接的其他方是否存在与之对应的记录,将显示连接中某成员表中的全部记录。 自连接在单个表之内结合数据。在A c c e s s中创建自连接时,需要向查询添加一个表的复制件( A c c e s s将为复制件提供一个别名),然后与复制的记录之间创建连接。 T h e t a连接在结合数据时使用的是比较操作符而不是=。Theta 连接包含用于返回不具备某个特定关系的记录的查询所使用的不等号( )。实现theta 连接用的是W H E R E准则而不是SQL JOIN 保留字。“查询设计”窗口并不用字段名之间划线的形式指示theta 连接,theta 连接不会显示在“关系”窗口。本书所带光盘 B e c k w i t h文件夹下的B e c k w i t h . m d b数据库具有环状的关系集合。从C D - R O M或者从硬盘上的复制件打开B e c k w i t h . m d b,然后单击“关系”按钮,打开“关系”窗口(见图1 0 - 2 )。S e c t i o n s和C o u r s e s之间为多对一的关系, D e p a r t m e n t s和C o u r s e s之间为一对多关系,E m p l o y e e s和D e p a r t m e n t s之间为多对一关系,E m p l o y e e s和S e c t i o n s之间为一对多关系。你还可以看到C o u r s e s、E n r o l l m e n t s、S t u d e n t s、G r a d e s和C o u r s e s之间也存在一个环形的关系集。当你想测试具有大量记录的查询性能时, B e c k w i t h . m d b十分有用。这个虚构的Beckwith College位于N a v a s o t a、Te x a s,拥有30 000名学生,2 320名雇员,在1 4个系的5 9 0门课程中提供了1 770班级。图10-2 Beckwith 示例数据库中表之间的关系注意Beckwith数据库的设计上存在小小的缺陷。一个教授同时属于多个系的情况是极为可能的,但是在图1 0 - 2所示的结构图中却不允许这种情况发生。允许教授隶属于多个系时,需要建立多对多关系和Employee-Departments关系表。10.2.1 创建传统的单列等值连接基于每个表中的一列所建立的连接称为单列连接。下面详细给出了创建一个数据库、使所有查询都使用简单的单列连接时需要满足的基本规则: 关系中一方的每个表必须具有一个主键,并具有无重复索引来维护参照完整性。A c c e s s将自动地在一个表的主键字段上创建无重复索引。 多对多关系,例如O r d e r s到P r o d u c t s的关系,是靠一个中间表来实现的(在这里为O r d e rD e t a i l s ),该中间表和其中某个表之间存在一对多关系( O r d e r s到Order Details),而和另一个表之间存在多对一关系(Order Details到P r o d u c t s )。第10章创建多表查询和交叉表查询217 表中存在的重复数据(假设允许重复)被提取到一个具有主键、无重复、与提取重复数据的表具有一对多关系的新表中。使用多列主键来标识提取的数据常常是必须的,因为单个关键字字段可能会包含重复的数据。但是,关键字字段值的结合(也称为串联)必须是唯一的。Access 2000的“表分析器向导”可以自行定位和提取大部分重复数据。我们在第11章将描述如何手工地从表中提取重复数据。如果需要使用生成表查询的帮助,请参见11 . 2节“用生成表查询创建新表”。如果你对如何创建关系还不熟悉,请参见4 . 1 0 . 1节“建立表之间的关系”。N o r t h w i n d数据库中的所有连接,在图1 0 - 1中用相邻表字段名之间的连线标识,都是具有一对多关系的表之间的单列等值连接。A c c e s s使用ANSI SQL-92 保留字INNER JOIN来标识传统的等值连接,用LEFT JOIN或者RIGHT JOIN指定外连接。如果想学习有关S Q L连接的更多术语,请参见2 3 . 4 . 4节“用S Q L创建连接”。在基于等值连接的查询中最为常见的用法便是用顾客名字和地址接收到的订单匹配。例如,你或许希望创建一个简单的报表,列出顾客名字、订单数目、订单日期和数量。遵循如下步骤,创建一个传统的一对多,单列等值连接查询,将N o r t h w i n d的顾客和他们的订单关联起来,并按照公司和订单的日期进行排序:1) 如果N o r t h w i n d . m d b是打开的,关闭除了“数据库”窗口之外的所有窗口;否则打开N o r t h w i n d . m d b。2) 单击“数据库”窗口中的“查询”快捷方式,然后双击在“设计”视图中“创建查询”快捷方式。Access 在空的“查询设计”窗口上显示“显示表”对话框。3) 从显示表列表中选择C u s t o m e r s表,单击“添加”按钮。或者,也可以双击C u s t o m e r s表名字,将该表添加到查询中。A c c e s s将在“查询设计”窗口中添加C u s t o m e r s表的“字段名字”列表。4) 双击“显示表”列表中的O r d e r s表,然后单击“关闭”按钮。A c c e s s将O r d e r s表的“字段名称”列表添加该窗口中,并在两个表的C u s t o m e r I D字段之间添加了一条连线,指示两者之间存在的连接。A c c e s s是自动创建该连接的,因为C u s t o m e r I D是C u s t o m e r s表的主键字段,而A c c e s s在O r d e r s表中发现了具有相同名字的字段(外部键)。5) 为了用顾客的名字标识每个订单,可选择C u s t o m e r s表C o m p a n y N a m e字段,并将字段符号拖到“查询设计”网格的第一列的“字段”行。6) 选择O r d e r s表的O r d e r I D字段,将字段符号拖到第二列的“字段”行。将O r d e r D a t e字段拖到第三列。查询设计现在的状态如图1 0 - 3所示。图10-3 该查询显示按公司名字和日期排序的顾客签订的订单7) 单击“运行”或者“查询视图”按钮,显示查询结果, R e c o r d s e t如图1 0 - 4所示。注意查询结果集的字段标题显示了表字段的标题(其中包含有空格),而不是实际的字段名,实际的字段名中是没有包含空格的。图10-4 连接Customers和Orders表的图10-3所示的查询设计所产生的结果10.2.2 为查询结果集指定排序次序Access 显示查询结果集时是按照主键字段上的索引的次序进行显示的。如果代表主键字段的列不止一个, A c c e s s将按照关键字列出现的次序从左到右排序简单的查询结果集。因为C o m p a n y N a m e是最左边的主键字段,查询结果集将为单个公司按订单编号顺序显示所有订单。你可以改写主键显示的次序,只要向查询添加一个排序次序即可。例如,如果你想首先看到最近的订单,可以指定按订单日期的降序排序。遵循如下步骤,向查询添加这个排序次序:关于主键索引的更多信息,请参见4 . 1 0 . 4节“往表中添加索引”。1) 单击“设计视图”按钮,返回“查询设计”模式。2) 将插入符放到“查询设计”网格Order Date 列的“排序”行,按下F 4,打开下拉列表。3) 从下拉列表中选择“降序”,指定在日期上按降序排序最近的订单在先(见图1 0 - 5 )。4) 单击“运行”按钮或者“数据表视图”按钮,显示新排序次序下的查询结果集(见图1 0 - 6 )。218 第二部分最大限度地利用查询图10-5 向查询添加一个特定的排序次序图10-6 向查询添加Order Date降序排序之后的结果第10章创建多表查询和交叉表查询21910.2.3 使用表之间的间接关系创建查询可以创建查询返回不直接相关的记录,例如每个顾客所购买的产品的类别。必须将作为连接链中一个链接的每个表包含在查询中。例如,如果创建查询是为了显示每个顾客所购买产品的类别,则必须将C u s t o m e r s和C a t e g o r i e s表之间存在的连接链上的每一个作为中间链接的表都包含到查询中。该链中包含C u s t o m e r s、O r d e r s、Order Details、P r o d u c t s和C a t e g o r i e s表。但是,不需要从中间表向查询设计网格添加任何字段; C o m p a n y N a m e和C a t e g o r y N a m e字段就足够了。遵循如下步骤,修改顾客和订单查询,创建一个查询,显示间接相关记录中的的字段:1) 在“查询设计”视图中,删除查询的OrderID 列,单击字段行上方的细条,将整个列选定(突出显示), 然后按下D e l e t e键。在OrderDate 列上也执行相同的过程,只留下CompanyName 列显示在查询中。2) 单击工具栏的“显示表”按钮或者选择“查询”,“显示表”,按顺序将Order Details、P r o d u c t s和C a t e g o r i e s表添加到查询中;然后单击“添加表”对话框的“关闭”按钮。图1 0 - 7上面的窗格显示出Access 自动地在C u s t o m e r s和C a t e g o r i e s表之间基于每个中间表的主键字段和相邻表中同名的外部键字段创建出来的连接链。提示在添加表到“查询设计”窗口中时,该表的字段列表可能不随之出现在上面的窗格中。可以使用上面窗格中的垂直的滚动条来显示“隐藏起来”的表。可以将“表字段”列表拖放到上面窗格的上方,然后重新排列字段列表,使之与图10-7所显示的式样相匹配。3) 从C a t e g o r i e s字段列表将C a t e g o r y N a m e拖到网格第二列的“字段”行。或者,通过双击字段名字也可以将之加到网格中的下一个空列上(见图1 0 - 7 )。图10-7 从没有直接关系的表创建查询所必须的连接链4) 单击工具栏上的“运行”按钮。查询结果集如图1 0 - 8所示。5) 单击窗口的“关闭”框,关闭查询。该查询只是一个例子,所以不需要保存它。提示图1 0 - 8中的查询结果集有2 100多行,大多数都是重复的。为了删除重复,可以右击“查询设计”视图上面窗格中的空白区域,并选择“属性”,打开“查询属性”页。双击“唯一值”文本框,将唯一值设为“是”。再次运行查询验证一下重复是否不见了。本章后面的“创建多列等值连接和选择唯一值”一节将给出一些其他使用“唯一值”查询属性的例子。图10-8 图10-7中的查询所产生的Customers-Categories记录集在不直接相关的表上进行查询的情况极为常见,尤其当你想用S Q L总计函数或A c c e s s的交叉表查询进行数据分析的时候更是如此。更多的信息,可以参见本章后面“使用S Q L总计函数”和“创建交叉表查询”两节中的内容。10.2.4 创建多列等值连接和选择唯一值在两个表之间可以具有多个连接。例如,你可能希望能创建一个查询,返回票据和运输地址相同的顾客名字。票据地址是C u s t o m e r s表的A d d r e s s字段,而运输地址为O r d e r s表的S h i p A d d r e s s字段。因此,需要匹配两个表中的C u s t o m e r I D字段以及C u s t o m e r s . A d d r e s s和O r d e r s . S h i p A d d r e s s。这个任务需要多列等值连接才能完成。遵循如下步骤,创建这个地址匹配多列等值连接的例子:1) 在“设计”视图中打开一个新的查询。2) 向查询添加C u s t o m e r s和O r d e r s表,关闭“添加表”对话框。3) 单击并将C u s t o m e r s表“字段列表”框中的A d d r e s s字段拖到O r d e r s表的“字段列表”框的S h i p A d d r e s s字段。这将创建另一个连接,由A d d r e s s和S h i p A d d r e s s之间新的连线指示(参见图1 0 - 9中上面的窗格)。A d d r e s s和S h i p A d d r e s s之间新的连线在两端都有园点,指示出这时在一对没有特定关系的字段之间建立的连接,它们不具有相同的字段名字,或者主键索引。4) 将C u s t o m e r s表的C o m p a n y N a m e和A d d r e s s字段分别拖到查询的第一和第二列的字段行,然后丢放该字段。将O r d e r s表的S h i p A d d r e s s字段拖到查询的第三列并将该字段丢放在该列的字段行(参见图1 0 - 9中下面的窗格)。图10-9 将一个表中的某个字段名称拖到另一个表中某个字段上,创建一个多列等值连接5) 单击工具栏上的“运行”按钮。图1 0 - 1 0所示为查询产生的结果。6) 要消除重复的行,必须使用“查询属性”窗口的“唯一值”选项。为了显示“查询属性”窗口,如图1 0 - 11,需要单击“设计视图”按钮,然后单击工具栏的“属性”按钮或者双击“查询设计”窗口的上面窗格中的空白区域。如果“属性”窗口的工具栏显示“字段属性”或者“字段列表”,单击“查询设计”窗口上面窗格中的空白区域,让标题栏显示“查询属性”。或者,右击上面窗格中的空白区域,从弹出菜单中选择“属性”。7) 在默认情况下,“唯一记录”的属性和“唯一值”属性的设置都为“否”。将插入符放到“唯一值”文本框并按下F 4,打开下拉列表。选择“是”并关闭该列表。设置“唯一值”属性220 第二部分最大限度地利用查询手工添加连接为“是”将导致在查询上添加ANSI SQL 保留字D I S T I N C T。再次单击“属性”按钮,关闭“属性”窗口。关于删除重复记录的更多的信息,请参见2 3 . 6 . 9节“ J e t的D I S T I N C T R O W和S Q L的DISTINCT 关键字”。提示或者,也可以双击“属性”窗口中其文本框来改变“唯一记录”和“唯一值”属性的设置。所有具有“是/否”值的属性都可以靠双击来切换它的值。8) 单击工具栏上的“运行”按钮。结果集中不再包含重复的行,如图1 0 - 1 2所示。图10-12 删除了重复行的查询结果集9) 单击“关闭窗口”按钮,关闭查询,不进行保存。这样便可以避免让过时的查询例子搞乱“数据库”窗口中的“查询”列表。因为大部分订单具有相同的票据和运输地址,所以更为有用的查询是找出顾客的票据和运输地址不同的订单。但是,使用多列等值连接是无法创建这个查询的,因为Access SQL的INNER JOIN 保留字不能接受 操作符。所以需要使用准则添加一个不相等连接,而不是使用一个多列连接,具体见本章后面“用准则创建不相等t h e t a连接”。如果在你运行前面的查询时,遇到“输入参数”对话框,请参见本章后面“疑难解答”部分中的“缺少查询的对象”。第10章创建多表查询和交叉表查询221图10-10 订单查询结果集,返回票据地址和运输地址相同的顾客订单图10-11 使用“查询属性”窗口来只显示具有唯一值的行222 第二部分最大限度地利用查询10.3 使用表中的查找字段Access 2000的表字段查阅功能允许你替代传统的字段文本框所使用的下拉列表框或者列表框。查阅功能是一个由Access 自动地创建的一对多查询。查阅功能允许你为某个特定的字段提供一个可接受值的列表。当你从该列表中选择值的时候,该值将自动地输入到当前记录的字段中。可以指定的查阅字段有以下两种类型: 在一个包含外部键值的字段,来自一个相关基本表的一个或者多个字段组成的值列表的字段。这种类型的查找字段目的是添加或者更改外部键值,确保外部键值和一个主键值相匹配,从而保持了相关的完整性。在定义一个包含外部键的字段时,两表之间必须在关系窗口中存在一个关系。例如, N o r t h w i n d . m d b的O r d e r s表具有两个外部键字段:C u s t o m e r I D和E m p l o y e e I D。C u s t o m e r I D字段的查找功能在一个下拉列表中显示了C u s t o m e r s表中的C o m p a n y N a m e字段值。E m p l o y e e I D字段显示的是E m p l o y e e s表的L a s t N a m e和F i r s t N a m e字段,两个之间由逗号和空格进行分隔(见图1 0 - 1 3 )。 除了单个主键字段外的任何字段中,提供一个可以从中选择的具有固定值的列表。字段列表保持了参照完整性,因为这样可以约束对应外部键字段值的主键值的选择。图10-13 查找字段的下拉值列表可以在“设计”视图或者表“数据表”视图中添加一个新的查阅字段;但是,在“设计”视图中只能向一个现有的字段上添加查阅功能。在“数据表”视图中,只能显示组合框控件,即便你指定的是列表框控件。在与具有查阅字段的表进行了绑定的窗体上,可以显示组合框或者列表框。在实践中,下拉列表(组合框的限制列表属性被设为了“是” )是查阅字段控件的最为常见的类型。以下几节将描述如何添加外部键和固定列表查阅功能到一个表字段上。10.3.1 用查阅向导添加外部键下拉列表在本书前面章节中创建的Personnel Actions表是一个使用外部键下拉列表的查找字段的“候选人”。遵循如下步骤,使用“查阅向导”将Personnel Actions表的p a I D字段改变为一个查找字段:1) 在“数据库”窗口中,选择Personnel Actions表,按下C t r l + C将该表复制到剪贴板上。2) 按下C t r l + V,显示“粘贴表方式”对话框。为复制输入一个名字,例如t b l L o o k u p,单击“确定”按钮,使用“结构和数据”创建复制。第10章创建多表查询和交叉表查询2233) 在“设计”视图中打开表的复制,并选择p a I n i t i a t e d B y字段。单击“查阅”选项卡,显示当前查阅属性;文本框控件不具有查找属性。打开“数据类型”下拉列表,选择“查阅向导”(见图1 0 - 1 4 )。“查阅向导”的第一个对话框便会出现。图10-14 选择“查阅向导”向一个字段添加查阅功能4) 你要用该字段去查找另一个表( E m p l o y e e s)中的值,所以接受第一个(默认)选项(见图1 0 - 1 5 )。单击“下一步”按钮,显示“查阅向导”的第二个对话框。5) 在激活“视图表”选项的情况下,选择E m p l o y e e s基本表,p a I n i t i a t e d B y字段与之是相关的(见图1 0 - 1 6 )。单击“下一步”按钮,显示第三个对话框。6) 单击按钮三次,添加E m p l o y e e I D、L a s t N a m e和F i r s t N a m e字段到查找列表中(见图1 0 -1 7 )。必须包含与基本表关键字字段相关的外部键字段。单击“下一步”按钮,进入第四个对话框。7) 调整列的宽度,使得在显示姓名时不要留下过多的尾部空白。向导将确定E m p l o y e e I D是关键字列并推荐隐藏该关键字列(见图1 0 - 1 8 )。单击“下一步”,显示第五个同时也是最后一个对话框。图10-15 在表的外部键和第一个“查阅向导”对话框中的固定列表查找之间进行选择图10-16 为外部键查找字段选择基本表或者查询8) 在文本框键入Initiated By作为查找字段的标签。9) 单击“完成”按钮,结束向导的工作。当向导问你是否保存表的设计时,单击“确定”。新的查找字段属性将出现,如图1 0 - 1 9所示。由向导创建的作为行来源属性的Jet SQL 查询语句为SELECT DISTINCTROW Employees.EmployeeID , E m p l o y e e s . L a s t N a m e ,Employees.FirstName FROM Employees;。图10-19 添加到paInitiatedBy字段的查找属性提示步骤6之前各步中是以它们的表次序添加字段的,但是你可以用“查阅向导”以你喜欢的任何次序添加字段。或者,也可以在创建了查找列表之后编辑行来源属性的S Q L语句来重新安排各列。10) 向导将p a I n i t i a t e d B y字段重新命名为E m p l o y e e I D,所以将“字段名称”属性改回p a I n i t i a t e d B y。改变字段名字不会影响到该查找操作。11) 单击“表视图”按钮,保存在显示该表数据表上的改变。只有列表的第一个可见的列出现在Initiated By 列。将Initiated By 列的宽度调整为和下拉列表的宽度大致相同,约为1.5 英寸。将插入符移到Initiated By 列,打开下拉列表,显示向导的工作(见图1 0 - 2 0 )。12) 返回“设计”视图,选择p a I n i t i a t e d B y字段的行来源属性,单击“创建”按钮,在“查询设计”窗口中显示行来源的S Q L语句(见图1 0 - 2 1 );然后关闭“查询设计”窗口。224 第二部分最大限度地利用查询图10-17 选择字段包含在你的查找列表中图10-18 调整查找列表的列宽,隐藏关键字列第10章创建多表查询和交叉表查询225提示如果查阅向导改变了查阅字段的名称,确保将之改正为最初的值。如果字段名与基本表的字段名不同,向导便会改变字段名字。尽管说“名称自动更正”可以处理字段名字的改变,但是解冻表和字段的名字是一个很好的数据库设计习惯。在开发过程中改变表和字段名的做法属于迫不得已而为之。如果需要向导创建的组合框控件的属性列表,请参见1 3 . 3 . 9节“使用组合和列表框”。图10-21 在“查询设计”视图中的行来源属性的SQL语句提示如果在查阅字段和基本表字段之间存在一个关系,A c c e s s将重新创建这个关系。此时,一些带有_ 1或者_ 2后缀的特别的表将出现在“关系”窗口中。这个问题在Access 95就有,在A c c e s s2 0 0 0中仍未修复。你可以从“关系”窗口中删除这些伪造的表,不会影响到查找字段的操作。10.3.2 向一个表添加固定值查找列表添加另一个查找功能固定值列表的过程和在前面章节中使用查找向导创建外部键查找列表的过程在很多地方都是一样的。遵循如下步骤,向Personnel Actions表的复制件中的p a Ty p e字段添加一个固定列表查找功能:1) 选择p a Ty p e字段,打开“数据类型”列表,选择“查阅向导”,启动向导。2) 在第一个“查阅向导”对话框中,选择“我将键入我想要的值”选项,单击“下一步”按钮。3) 在第二个“查阅向导”对话框中,在“列数”文本框中键入2,按下Ta b键,创建第二个列表列。4) 在四行的列1和列2列中键入H,Hired; Q,Quarterly Review; Y,Yearly Review;和S,Salary Adjustment。调整列的宽度与输入相适合(见图1 0 - 2 2 )。单击“下一步”按钮,显示向导的第三个对话框。5) paTy p e字段使用的是人员操作类型的单字符缩写,所以选择列1作为“唯一标识该行的图10-20 “查阅向导”创建的下拉查找列表字段”( p a Ty p e字段不能唯一的标识该行;列1包含的是你想插入到字段中的单个字符值)。单击“下一步”按钮,显示第四个也是最后一个向导对话框。6) 键入Ty p e作为列的标签并单击“完成”按钮。p a Ty p e字段的查找属性便会出现,如图1 0 - 2 3所示。“行来源类型”为“值列表”。在“行来源”中包含如下的值:“H”;“H i r e d”;“Q”;“Quarterly Review ”;“Y”;“Ye a r l yR e v i e w”;“S”;“Salary Adjustment”。7) 向导又一次改变了字段名字,这次是标签的名字,所以将字段名属性的值改变为paType。8) 单击“表”视图按钮并保存对表所做的改变。将Type 列的宽度增加为约1.5 英寸,将插入符放入到Type 列内,打开固定值列表,检查一下向导的工作是否正确(见图1 0 - 2 4 )。9) 如果你不要缩写出现在下拉列表中,便将“列宽”属性值的第一项改变为0。10) 如果你想从一个字段删除查找特征,便选定该字段,单击“查找”选项卡,从“显示控件”下拉列表中选择“文本框”。提示将一个查找字段的“列表宽度”属性设置为足以显示描述列的字符的值,以提供确定的选择。“列表宽度”属性决定着列表的最大宽度,所以不需要扩展数据表视图中的字段宽度。注意查找功能在经验老练的数据库开发人员之间引发了一场争论。关系数据库纯化论者拒绝将查询作为表属性嵌入。使用外部键、下拉列表的另一个异议是不熟练的用户在打开列表之后容易在不经意间便改变了表中的数据。但是, Access 2000的查阅功能是一个有用的工具,对新数据库用户来说更是如此。10.4 向表或者查询添加子数据表子数据表与查阅字段密切相关,但是两者的目的却不相同。子数据表用于显示一个嵌入数据表中的相关的值,而查阅字段则是在一个组合框或者列表框中显示基本表的值。A c c e s s的这两个特征都依赖于一对多查询的等价物;查询之间的差异在于子数据表的多方为一个相关的表,而查找字段却使用对基表的查询来提供多方的值。你还可以将子数据表级联或者层叠起来进行226 第二部分最大限度地利用查询图10-22 在“查阅向导”的第二个对话框中添加查找列表值图10-23 用值列表属性创建的查阅字段属性图10-24 “查阅向导”创建的固定值列表多级连接表中相关数据的显示,查找字段不具有这项功能,但是一个表或者查询不能具有多个子数据表。图1 0 - 2 5所示的C u s t o m e r s表显示的是Alfreds Futterkiste的Orders 子数据表,其上带有为前三个订单显示Order Details记录的子子数据表。有关子数据表的更多信息,请参见4 . 5节“理解表和字段的属性”。图10-25 Customers表上具有Orders 子数据表和Order Details子-子数据表扩展注意子数据表与Visual Basic 6.0的层次式FlexGrid (MSHFlexGrid)控件很相似,后者在扩展的网格中显示相关的值。与子数据表不同, M S H F l e x G r i d控件是只读的并且使用了一种非标准SHAPE 查询语法向网格提供数据。10.4.1 表子数据表N o r t h w i n d . m d b的大部分表已经具有了子数据表;但是, E m p l o y e e s表还没有。遵循如下步骤,向E m p l o y e e s表添加一个Personnel Actions子数据表:1) 如果还没有在Personnel Actions表的p a I D字段和E m p l o y e e s表的E m p l o y e e I D字段之间添加一个关系,则现在便需要添加该关系。选择“工具”,“关系”,打开“关系”窗口,单击工具栏的“显示表”按钮,添加Personnel Actions表。将E m p l o y e e s表的E m p l o y e e I D字段拖向Personnel Actions表的p a I D字段,标记“编辑关系表”的“实施参照完整性”复选框,单击“创建”,建立该关系,然后关闭“关系”窗口,保存所做的改变。如果你需要复习一下关系的规划和创建,请参见4 . 1 0节“使用关系、关键字字段和索引”。2) 在“数据表”视图中打开E m p l o y e e s表。3) 单击E m p l o y e e s数据表的首列中的+号之一,打开“插入子数据表”对话框。4) 在列表中选择Personnel Actions表。PaID 外部键字段出现在“链接子字段”下拉列表中,并且E m p l o y e e I D字段出现在“链接主字段”列表中(见图1 0 - 2 6 )。该关系表为两个下拉列表提供了默认值。“链接主字段”和“链接子字段”值在指定的字段上创建了一个一对多连接。5) 单击“确定”,添加该子数据表并关闭该对话框。6) 单击E m p l o y e e s数据表内的一个或者多个+符号,显示新增加的子数据表(见图1 0 - 2 7 )。7) 切换到“表设计”视图,单击“属性”按钮,显示“表属性”窗口。你在“插入子数据表”对话框中所做的选择出现在表的子数据表相关的属性中(见图1 0 - 2 8 )。第10章创建多表查询和交叉表查询227注意子(外部键)字段p a I D没有作为子数据表的列出现。当你在子数据表中添加一个新的记录时,A c c e s s会自动地将所选的基本表记录的主键值插入到相关的记录中。提示新创建的表的子数据表名称属性具有默认值自动,它没有向新表数据表添加方框+号列。选择“插入”,“子数据表”,打开新表的“添加子数据表”对话框。或者,也可以直接在“表属性”窗口中设置子数据表属性。将“子数据表名称”的属性值设为无,便可以删除一个子数据表。如果你从表中删除一个子数据表,将“子数据表名称”设为自动,则会显示方框+号并让你在“设计”视图中添加一个新的子数据表。10.4.2 查询子数据表如果不希望子数据表显示所有相关表的列,则必须设计一个简单的选择查询,只选择所需的字段,然后使用该查询向子数据表提供数据。比如,你可以将C u s t o m e r s表O r d e r s子数据表的宽度减到最小,具体做法如下:1) 创建一个简单的选择查询, q r y S h o r t O r d e r s,使之只包含O r d e r s表的O r d e r I D、CustomerID (主-子连接需要该字段)、O r d e r D a t e、S h i p p e d D a t e和S h i p p e d Vi a字段。2) 在“设计”视图中打开C u s t o m e r s表,打开“表属性”窗口,从子数据表名称列表中选择查询. q r y S h o r t O r d e r s,替换掉O r d e r s表。C u s t o m e r I D将仍旧保持链接字段的值。3) 返回“数据表”视图,保存所做改变。扩展子数据表将出现,如图1 0 - 2 9所示,并没有显示Order Details子-子数据表的+号列。4) 关闭C u s t o m e r s表,在“设计”视图中打开q r y S h o r t O r d e r s,右击上面窗格中的空白区域,选择“属性”,打开“查询属性”窗口。5) 在“子数据表名称”字段选择表Order Details,然后在两个“链接. . .字段”文本框中键入O r d e r I D (见图1 0 - 3 0 )。6) 运行查询,然后扩展一个或者多个子数据表,测试一下你的工作(见图1 0 - 3 1 )。228 第二部分最大限度地利用查询图10-26 添加Personnel Actions表作为Employees表的子数据表图10-27 两个扩展的PersonnelActions表子数据表图10-28 Employees的“表属性”窗口展示了向“子数据表名称”、“链接子字段”、“链接主字段”和“子数据表高度”和“扩展”属性上添加的值第10章创建多表查询和交叉表查询229图10-29 带有基于某个查询的子数据表的Customers表7) 关闭q r y S h o r t O r d e r s,保存所做的改变,打开C u s t o m e r s表,显示子数据表。新版本的C u s t o m e r s表将出现,如图1 0 - 3 2所示。图10-32 Customers表上带有基于查询的Orders 子数据表和Order Details子-子数据表图10-30 在“查询属性”页中向一个查询添加子数据表图10-31 Order Details 子数据表添加到qryShortOrders查询上提示如果想在基于查询的数据表中更新或添加新的记录,便需要将所有具有必要值的字段都包含在查询中。如果你没有包含所有的必填字段,则当你试图添加一个新的记录时,便会收到一个错误消息。10.5 外连接、自连接和Theta连接本章的前面部分描述的是等值连接,或者用S Q L - 9 2的话来说,内连接。在数据库应用中内连接是最为常见的连接类型。A c c e s s还允许你创建其他三种类型的连结:外接、自连接和t h e t a。以下几节将分别描述这三种较为少见的连接类型。10.5.1 创建外连接外连接可以显示参与查询的表中的全部记录,不管有无相应的记录存在于连接的表中。在A c c e s s中,外连接有两种类型,左外连接和右外连接。在A c c e s s中的一个左外连接查询显示具有唯一主键值的表中的所有记录,不管在多方的表中是否存在与之匹配的记录。与之相反,右外连接查询将显示多方表中的所有记录,不管在主表中是否存在与之相关的记录。在多方的表中由许多记录常常存在一些在一方表中没有相应记录的记录,但是,这些记录都不是必须的,是孤立记录;这些类型的记录与另一个表可能有多对一的关系。遵循以下步骤,实际创建一个左外连接,检测在Personnel Actions表中是否缺少相应的雇员记录:1) 打开一个新的查询,添加E m p l o y e e s和Personnel Actions表。2) 将E m p l o y e e I D字段符号拖到Personnel Actions的p a I D字段,如果A c c e s s没有创建该连接的话,在这两个字段之间创建一个等值连接(如果在本章前面或创建Personnel Actions表的时候,曾在这两个字段之间建立关系,则A c c e s s将自动地创建这个连接)。3) 选定并拖动E m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论