第六章:查询和更新多表

利用 Visual FoxPro 可以查询多个表和视图,同时可以把远程和本地数据合并到一个视图中。当需要的数据存储在两个或多个表中,或者分散在本地表和远程数据源的表中时,这个功能非常实用。

有关建立简单的单表查询和视图的详细内容,请参阅第四章“检索数据”和第五章“使用视图更新数据”。有关连接的详细内容,请参阅《程序员指南》中的第七章“处理表”

本章内容要点:

对多个表和视图进行查询

当需要获取存储在两个或更多表中的信息时,只要把所有有关的表添加到查询中并用公共字段联接它们就可以了。此后搜索所有这些表中的记录时便可以查找所需的信息。在查询中可以使用数据库表、自由表、本地或远程视图的任意组合。

在查询中使用多表或视图

因为“视图”可以指输入源或正在创建的对象,“表”用来表示表和作为输入源的视图,所以“视图”在此处表示用“视图设计器”创建的对象。

将视图和表添加到查询中

向查询中添加表或视图时,Visual FoxPro 根据匹配的字段建议一个可能的表或视图之间的联接。

例如,如果在“查询设计器”中加入 Visual Studio …\Samples\Vfp98\Data 中的 Customer 表,然后加入 Orders 表,Visual FoxPro 就建议按匹配的字段 Customer.cust_id 和 Orders.cust_id 建立表之间的联接。

建立表之间的联接

如果使用的数据库中,表或视图间具有永久关系,Visual FoxPro 就利用这些已有的关系作为默认的联接。

若要在查询中添加数据库表或视图,需要先打开适当的数据库,运行该数据库。

若要在查询中添加表或视图

  1. 在“查询设计器”工具栏中,选择“添加表”按钮。

  2. “添加表或视图”对话框中,选定想要用的数据库,选择“表”或“视图”选项,再选择想添加的表或视图,然后选择“添加”按钮。

    — 或者 —

    若想添加的表不在数据库中,则请选择“其他”按钮,在“打开”对话框中选定想加入的表,选择“确定”按钮。

  3. “联接条件”对话框中,检查建议的联接。

    若 Visual FoxPro 找不到这样的匹配字段,则应该由您自己在“联接条件”对话框中选择匹配的字段。

  4. 选择“确定”按钮。

用联接控制记录的选择

如果查询中有多个表,可用更新或添加联接来控制查询选择的记录。使用“联接条件”对话框,可改变表之间的联接类型。

添加表时会自动显示联接。但是,如果相关的字段名不匹配,则必须自己创建表间的联接。也可以创建其它的联接,方法是在“查询设计器”中,拖动表中的字段与另一表中的字段联接;或者从“查询设计器”工具栏上选择“添加联接”按钮,这时会显示“联接条件”对话框

“联接条件”对话框

添加或变更联接时,可选择联接类型来扩充或缩小结果。创建联接的最简单方法是使用“联接条件”对话框。

若要创建表之间的联接

  1. 向查询中添加两个或多个表。

  2. 在“查询设计器”工具栏中,选择“添加联接”。

  3. 在“联接条件”对话框中,从两个表中选择相关的字段名。

    注释 仅当字段的大小相等、数据类型相同时才能联接。

  4. 选择联接类型:
    若要检索... 请使用...
    两个表中仅满足条件的记录,这是最普通的联接类型。 内部联接
    表中联接条件左边的所有记录,和表中联接条件右边的且满足联接条件的记录。 左联接
    表中联接条件右边的所有记录,和表中联接条件左边的且满足联接条件的记录。 右联接
    表中不论是否满足条件的所有记录。 完全联接

  5. 选择“确定”。

有关“联接”的详细内容,请参阅《程序员指南》中的第八章“创建视图”

您也可以删除或修改现有的联接。虽然没有联接仍能运行查询,但所得的查询结果一般很少有实用价值,并且执行时间往往很长。

若要删除联接

除了筛选和联接类型外,还可通过改变联接的条件来控制结果。联接不必基于完全匹配的字段;可基于“Like”、“==”、“>”或“<”条件设置不同的联接关系。

联接条件和筛选条件类似;二者都先比较值,然后选出满足条件的记录。不同之处在于筛选是将字段值和筛选值进行比较,而联接条件是将一个表中的字段值和另一个表中的字段值进行比较。

例如,当查询用各自的 customer ID 字段 (Customer.cust_id = Orders.cust_id) 联接的两个表时,查询只检索与这两个字段相匹配,同时也符合查询中设置的其他筛选条件的记录。

若要修改联接

  1. 在“联接”选项卡中,选择要修改的联接。

  2. 按需要更改联接条件。

有关在联接条件中使用的逻辑运算符的详细内容,请参阅“逻辑运算符”部分。

在视图中使用多个表

可以在本地视图中合并两个或多个本地表。定义多表视图的过程类似于在查询中对多表进行操作的过程,但使用视图时,可以在对视图的输出进行操作的过程中更新源表内容。

例如,可以把 Visual Studio …\Samples\Vfp98\Data 中的 Customer 表和 Orders 表联接在一个视图中,并设置选定条件挑选出组合记录的一个子集,当在“浏览”窗口或表单中更新数据时,这些更新会被返回到源表中。

在视图中合并表

若要在视图中联接表

  1. 在“视图设计器”中,添加一个表。

  2. 选择“添加表”按钮,根据需要更改联接条件,然后选择“确定”按钮。

若要使源表可更新

  1. 在“视图设计器”中,选定“更新条件”选项卡。

  2. 选中“发送 SQL 更新”复选框。

    注释 若要激活“发送 SQL 更新”选项,必须先在表中设置关键字段。

有关控制表的更新的详细内容,请参阅第《程序员指南》中的第十七章“共享访问程序设计”

在视图中使用多个远程表

与远程数据源建立连接时,这个数据源可能包含许多相关表。您可以从中选择需要的表。需要的话还可以调整这些选取表之间的关系,获得所需的信息。

例如,假设连接到了一个出版数据库上,其中包含许多内部相关的表。如果要搜索关于标题和作者的信息,可以利用三个相关的表:authors、titles 和 titleauthor。

在远程视图中的多个表

若要创建多表远程视图

  1. 从“文件”菜单中,选择“新建”命令,再选定“远程视图”,然后选择“新建文件”按钮。

  2. “选择连接或数据源”对话框中,选择一个已定义的连接或可用的数据源。

  3. 根据要求登录到服务器上。

  4. 在“打开”对话框中,选定您要用的第一个表。

  5. 选择“添加表”按钮以选定附加的表。

与本地视图一样,可以利用视图设计器中的“更新条件”选项卡中的选项控制源表的更新方式。

在视图中合并本地和远程数据

如果需要的数据存贮在远程数据源中,并且又与本地表中的信息相关,就可以在一个视图中合并本地数据和远程数据。

首先,可以创建远程视图,从远程服务器上仅挑选出想操作的相关记录;然后,利用本地视图,把该远程视图和相关的本地表联接起来。

例如,假设有一个巨大的主要客户数据库存放在服务器上,并且有一个本地表存贮了订货信息。可以创建远程视图,连接到服务器上并挑出感兴趣的客户记录;然后再创建一个本地视图,并将该远程视图和本地表添加到其中。

当利用本地视图的记录输入新的订单时,可以选择更新远程视图和本地表。如果关闭本地视图,然后关闭远程视图,远程视图会更新在远程客户数据库上的表。

在本地视图中的远程视图和本地表

若要在视图中合并远程和本地数据

  1. 创建远程视图并加入一个或多个远程服务器上的表。

  2. 创建新的本地视图并把刚创建的远程视图加入到其中。

  3. 将相关的本地表加到本地视图中,并根据公共字段把本地表和远程视图联接起来。

  4. 在本地视图中设置选定条件,然后运行该视图。

  5. 更新本地视图中的结果,使本地表和远程视图都得到更新。

  6. 关闭本地视图及远程视图,以更新远程服务器上的数据。

有关在其他视图中处理视图的详细内容,请参阅《程序员指南》中的第八章“创建视图”