VF6 多表更新 set relation to

VF6版本的SQL不支持直接的多表更新操作,但可以通过SETRELATIONTO命令建立表间关系,再执行更新。首先打开父表和子表,对它们进行排序并建立索引,然后使用SETRELATIONTO根据公共字段建立关系,最后执行更新语句。这种方式模拟了多表更新的效果,使得在VF6中也能完成类似操作。
摘要由CSDN通过智能技术生成

vf6的sql语句可以实现多表查询,但是受限于版本限制,无法实现多表更新,但可以通过set relation to实现多表更新的效果。

首先看官方文档:

set relation 命令

请参阅

在两个打开的表之间建立关系。

语法

SET RELATION TO
[eExpression1 INTO nWorkArea1 | cTableAlias1
[, eExpression2 INTO nWorkArea2 | cTableAlias2 ...]
[IN nWorkArea | cTableAlias]
[ADDITIVE]]

参数
eExpression1

指定用来在父表和子表之间建立关系的关系表达式。关系表达式通常是子表主控索引的索引表达式。
子表的索引可以是单项索引 (.IDX)、多项结构复合索引 (.CDX) 或独立复合索引。如果是复合索引,应指定适当的索引标识来排序子表。SET ORDER 可用来指定排序子表的索引标识。
例如,考虑“说明”部分描述的 customer 和 orders 两表。假定子表 orders 已经建立索引,并且使用如下命令用顾客编号进行排序:

SET ORDER TO TAG cust_id


要在 customer 和 orders 两表的顾客编号上建立关系,应选择包含父表 customer 的工作区或使用 IN 子句来指定父表的工作区或别名。然后,发出 set relation 命令,用如下关系表达式指定索引表达式:

SET RELATION TO cust_id INTO orders


除非关系表达式是数值型的,否则子表必须建立索引。如果发出包含非数值关系表达式的 set relation 命令时,子表没有使用索引进行排序, Visual FoxPro 显示错误信息。
如果 eExpression1 是数值型表达式,那么当记录指针在父表中移动时,将计算此表达式。然后,子表的记录指针移到记录编号为 eExpression1 的记录上。

INTO nWorkArea1 | cTableAlias1

指定子表的工作区编号 (nWorkArea1) 或子表的表别名 (cTableAlias1)。

eExpression2 INTO nWorkArea2 | cTableAlias2 ... 

指定其他关系表达式 (eExpression2) 和子表,建立另一个父表和子表之间的关系。在一条 set relation 命令中可以创建单个父表与多个子表之间的关系,但是各个关系之间要用逗号隔开。
nWorkArea2 指定工作区编号,cTableAlias2 指定子表的别名。

IN nWorkArea

指定父表的工作区。

IN cTableAlias

指定父表的别名。
IN 子句允许创建关系时不必首先选择父表工作区。如果 set relation 命令中省略了 nWorkArea 和 cTableAlias,父表必须在当前选定的工作区中打开。

ADDITIVE

保留当前工作区中所有已存在的关系并创建指定的新关系。如果命令中不包括 ADDITIVE 子句,将断开当前工作区中的所有关系,然后再创建指定的关系。

说明

在建立关系之前,必须打开一个表(父表),而且还必须在另一个工作区内打开其他表(子表)。
相关的各表通常有一个相同的字段。例如,假定表 customer 包含顾客信息,有顾客姓名、地址和唯一的顾客编号等字段。表 orders 包含订货信息,也有顾客编号字段,同时还有日期和发货信息等字段。SET RELATION 通过相同的字段,即顾客编号字段来联系两个表。要建立这种关系,子表必须在公共字段上建立索引。建立关系后,不论何时在父表 customer 中移动记录指针到指定顾客编号的记录上时,子表 orders 中的记录指针也将同时移到相同顾客编号的记录上。如果子表中找不到相匹配的记录,子表中的记录指针将停在表尾。

不带任何参数的 SET RELATION TO 命令将移去当前选定工作区中的所有关系。可用 SET

RELATION OFF 移去指定的父子关系。

 

例如:通过sql语句实现多表更新的一般操作:bmk和ez库有公共字段sfzh,ez的字段bch为空,现在想依据身份证号将bmk中的班次号bch填充ez的字段bch。

update ez set ez.bch=bmk.bch where ez.sfzh=bmk.sfzh

然而,在vf6中,这样操作会出现错误,必须先建立两表之间的连接:SET RELATION TO

close data
sele 2
use bmk
index on sfzh tag sfzh
set order to tag sfzh
sele 1
use ez
index on sfzh tag sfzh
set order to tag sfzh
set relation to sfzh into 2
update ez set ez.bch=bmk.bch where alltrim(ez.sfzh)==alltrim(bmk.sfzh)

 先打开子表bmk,建立索引,并进行排序;然后另一个工作区打开父表ez,建立索引,进行排序,然后以sfzh为纽带建立关系,这时候就可以执行以往的sql更新语句了。以下写法类似。

close data
use bmk in 1
index on sfzh tag sfzh
set order to tag sfzh
use lh in 2
sele 2
index on sfzh tag sfzh
set order to tag sfzh
set relation to sfzh into 1 
update lh set lh.bch=bmk.bch where alltrim(lh.sfzh)==alltrim(bmk.sfzh)

 执行sql语句成功的话,在vf6的数据工作期窗口可以看到如上的两个箭头和关系连接,代表关系成功建立。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值