| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4944 人关注过本帖
标题:数据表之间的关联更新问题
只看楼主 加入收藏
ycvf
Rank: 2
等 级:论坛游民
帖 子:210
专家分:56
注 册:2012-8-25
结帖率:75.61%
收藏
已结贴  问题点数:5 回复次数:10 
数据表之间的关联更新问题
程序代码:
SELECT B
use tjd.dbf
SET INDEX TO itjd
REINDEX
SELECT A
USE books.dbf
SET INDEX TO ibook
UPDATE on 书名 from tjd repl 单价 with B->单价,金额 with 册数*单价
LIST
表 books.dbf
书名  册数   单价   金额
PASCAL  40   8.70   348.00
Foxbase  40  8.5    340
表 tjd.dbf
书名 单价
PASCAL 9.00
foxbase 8.00
foxbase 8.5
要用tjd.dbf的更新books.dbf 表内容。
用上面的命令无法更新?请求帮助
搜索更多相关主题的帖子: ibook 数据表 
2012-10-13 11:58
cxzbzgz
Rank: 8Rank: 8
来 自:云南楚雄
等 级:贵宾
威 望:24
帖 子:298
专家分:808
注 册:2012-6-15
收藏
得分:2 
USE books
UPDATE 单价 SET=tjd.单价 WHERE book1.书名=tjd.书名
repl 金额 with 册数*单价 all

学习交流VFP,QQ:248561326。
2012-10-13 12:41
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:2 
只有[书名]为[PASCAL]的记录才能被更新,而[书名]为[Foxbase]的记录不能被更新,为什么不能被更新,自己仔细比对一下。
用SQL-SELECT语句的UPDATE命令更新,具体用法参照VFP帮助文件。
2012-10-13 12:47
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
VFP的版本,决定了UPDATE命令使用方法的不同。
2012-10-13 12:51
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
VFP6.0
update - sql 命令
以新值更新表中的记录。
语法
UPDATE [DatabaseName1!]TableName1
SET Column_Name1 = eExpression1
[, Column_Name2 = eExpression2 ...]
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]
参数
UPDATE [DatabaseName1!]TableName1
TableName1 指定要更新记录的表。
DatabaseName1 指定包含表的非当前数据库名。如果包含表的数据库不是当前数据库,则应包含这个数据库名。在数据库名称与表名之间有一个感叹号 (!)。
SET Column_Name1 = eExpression1
[, Column_Name2 = eExpression2
指定要更新的列以及这些列的新值。如果省略了 WHERE 子句,在列中的每一行都用相同的值更新。
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]
指定要更新的记录。
FilterCondition 指定要更新的记录所符合的条件。可以根据需要加入多个筛选条件,条件之间用 AND 或 OR 操作符连接。也可以用 NOT 操作符对逻辑表达式的值取反,或者使用 EMPTY( ) 函数检查字段是否为空。
说明
UPDATE-SQL 命令只能用来更新单个表中的记录。
与 REPLACE 命令不同的是,在更新可共享访问的表中的多个记录时,UPDATE-SQL 命令使用了记录锁。在多用户的情况下,使用记录锁能减少记录竞争,但是可能会降低使用性能。为了达到最好的性能,请以独占使用方式打开表或用 FLOCK( )
函数锁定表。


Visual FoxPro 9.0 语言参考
UPDATE - SQL 命令
用新值更新表中的记录。
注意:
SQL UPDATE 命令只能更新单个表中的记录。
UPDATE Target
   SET Column_Name1 = eExpression1 [, Column_Name2 = eExpression2 ...]
   [FROM [FORCE] Table_List_Item [[, ...] | [JOIN [ Table_List_Item]]]
   WHERE FilterCondition1 [AND | OR FilterCondition2 ...]
参数
UPDATE Target
指定一个目标表, 临时表, 表或临时表的别名, 或要更新的文件。可以在 FROM 子句中包含多个数据源用于更新操作。Target 可以用下面的语法:
[DatabaseName!]TableName DatabaseName! 如果表在非当前数据库中,指定一个包含表的数据库名。如果表在非当前数据库中,必须包含数据库名。用一个惊叹号(!)分隔数据库名与表名。 TableName 指定要进行更新操作的表名。
Alias Alias 指定一个要进行更新操作的 FROM 子句中表或当前数据工作期中临时表的别名。
FileName FileName 指定一个要进行更新操作的文件名。
SET Column_Name1= eExpression1 [, Column_Name2 = eExpression2 ...]  *NEW VFP9-用法变化
指定要进行更新的表中的列及其新值。如果省略 WHERE 子句,表中的每一行都用相同的值更新。如果想在表达式中使用某个对象的属性,需要将属性赋值给一个内存变量,然后在表达式中使用这个变量。例如,您可以指定 x = oColField("iid").Value ,然后在您的 UPDATE - SQL 命令中使用 SET 子句 set iid = x 。如果在表达式中直接引用对象属性,如 objectname.property,命令将把其当作别名对待,并使命令失败。可以在 SET 子句包含一个子查询(subquery)来指定表达式。如果子查询(subquery)没有返回任何结果,则其返回 NULL 。有关子查询(subquery)的语法和信息,请参见 SELECT - SQL 命令 - FROM 子句。 注意:
如果在 SET 子句中使用子查询(subquery),则不能在 WHERE 子句中使用子查询(subquery)。一个在 SET 子句中的子查询(subquery)必须正确运用, 与在关系操作中使用的子查询相同。
[FROM [FORCE] Table_List_Item[[, ...] | [JOIN [ Table_List_Item]]]  *NEW VFP9
指定一个或多个表,其中包含在更新操作中所用到的数据。除以下限制之外,FROM 子句的语法与在 SQL SELECT 命令中的的语法相同:
目标表或临时表不能包含在一个 OUTER 连接中作为一个次级表或临时表。
在目标表中执行一个 JOIN 操作前,它应该对所有其它 JOIN 操作求值。
目标临时表不能由子查询(subquery)产生。
更多的信息,请参见 SELECT - SQL 命令。FORCE 指定 Table_List 中的表将加入顺序,显示在 FROM 子句中。注意:
如果省略 FORCE,则 Visual FoxPro 试图优化更新操作。但是,通过包含 FORCE 关键字禁止对 Visual FoxPro 更新进行优化来执行删除操作,可能更快。
Table_List_Item 可以用下面的语法:
[DatabaseName!]Table [[AS] Local_Alias] DatabaseName! 如果表在非当前数据库中,指定一个包含表的数据库名。如果表在非当前数据库,必须包含数据库名。在数据库名后面、表名前面使用一个惊叹号(!)作为分隔符。 Table 指定想要从中得到更新数据的表或临时表名。如果没有打开表,Visual FoxPro 显示打开对话框,您可以从中指定文件位置。打开表之后,保持打开一直到查询成功。 Local_Alias 为 Table 中指定的表指定一个临时名。如果指定了一个本地别名,必须在整个 UPDATE 语句中用本地别名代替表名。别名可以表示一个表或一个临时表。 JOIN 指明了可以容纳多少指定的一个或多个次级表。不限制每一条 UPDATE 语句代码中表, 别名, 或 JOIN 子句的数量。
(Subquery) AS Subquery_Alias 一个子查询(subquery)指定了在另一个 SELECT 语句中的一个 SELECT 语句。有关在 SELECT 语句中子查询(subquery)的更多信息,请参见 SELECT - SQL 命令 中的 FROM 子句。
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]  *NEW VFP9 操作范围变化
指定一个或多个筛选条件,记录必须符合条件才用新值更新。在 WHERE 子句中不限制筛选条件的个数。要对逻辑表达式的值求反,可以使用 NOT 操作符。要防止空字段,可使用 EMPTY( ) 函数,更多的信息,请参见 EMPTY( ) 函数。
说明
想要确定被更新的记录数,可以在执行 SQL UPDATE 命令之后立即检查 _TALLY 系统内存变量的值。更多的信息,请参见 _TALLY 系统内存变量。
提示:
不同于 REPLACE 命令,当更新以共享访问方式打开的表的多条记录时,SQL UPDATE 使用记录锁。在多用户情况下,使用记录锁能减少记录竞争,但是可能会降低性能。为了达到最佳性能,应以独占方式打开表或使用 FLOCK( ) 函数所定表。更多的信息,请参见 FLOCK( ) 函数。
在 SET 中,Visual FoxPro 处理继续的任务 (译者注:执行一个后再执行下一个) 。例如,如果发出命令:UPDATE table1 SET field1 = field2, field2=field1, 两个字段的值不交换,而是 F1 和 F2 的值相同。
旧版代码示例
示例 1
下例使用 OPEN DATABASE 命令打开 Visual FoxPro 示例数据库,并用 USE 命令打开 TestData.dbc 数据库中的 Customer 表。SQL UPDATE 语句更新 MaxOrdAmt 字段的所有值为"25"。
复制代码
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
USE Customer     
UPDATE Customer SET MaxOrdAmt = 25
BROWSE FIELDS Company, MaxOrdAmt
更多的信息,请参见 USE 命令 和 BROWSE 命令。
示例 2
下例使用 OPEN DATABASE 命令打开 Visual FoxPro 示例数据库, TestData.dbc 。用 SQL SELECT 命令取得 TestData.dbc 数据库中 Products 表的数据存储到 MyProductsList 表,并显示新表。
用 CREATE CURSOR 命令创建 MyUpdateTable ,其中包含一个整型字段 Prod_Unit ,值为 10,然后显示该表。
SQL UPDATE 命令以 MyUpdateTable 表中的值更新 MyProductsList 表中产品名称为"Chai" 的 In_Stock 字段。用 SQL SELECT 命令取得并显示对 MyProductsList 表的查询, 展示出产品名称为"Chai"的被更新的 In_Stock 字段。
复制代码
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
SELECT in_stock, prod_name ;
    FROM Products ;
    INTO TABLE MyProductsList.dbf
BROWSE
CREATE CURSOR MyUpdateTable (prod_unit I(10))
INSERT INTO MyUpdateTable (prod_unit) VALUES (10)
BROWSE
UPDATE MyProductsList ;
    SET MyProductsList.in_stock = MyUpdateTable.prod_unit ;
    FROM MyUpdateTable ;
    WHERE MyProductsList.prod_name = "Chai"
SELECT * FROM MyProductsList
更多的信息,请参见 OPEN DATABASE 命令,BROWSE 命令,CREATE CURSOR - SQL 命令 和 INSERT - SQL 命令。
新功能代码示例 *NEW VFP9
示例 3
下例展示了在 UPDATE 语句的 SET 子句中的表达式使用一个子查询(subquery)。用此查询更新 products 表中的所有记录。如果在 mfg_msrp 表中存在不匹配的 productID,则字段 unitprice 设置为 NULL。
复制代码
UPDATE products ;
   SET unitprice = ;
       (SELECT (msrp*.90) ;
          FROM mfg_msrp ;
         WHERE mfg_msrp.productID = products.productID ;
           AND mfg_msrp.discontinued = .f.)
示例 4
下例展示了一个关联更新,只有符合 WHERE 子句中筛选条件的记录才被更新。
复制代码
UPDATE products ;
   SET unitprice = mfg_msrp.msrp*.90 ;
  FROM mfg_msrp ;
 WHERE mfg_msrp.productID = products.productID;
   AND mfg_msrp.discontinued = .f.
示例 5
下例是一个关联更新,更新结果中仅包含第一条寻找到的匹配记录。其它匹配的记录被忽略。示例代码指定了两个临时表。第一个是更新目标。第二个是更新的源,且内容中有二条与目标临时表第一条记录进行交换,不是更新所有目标临时表中记录。在结果中,第一条记录的值是第一个匹配 .50 ,而不是第二个匹配 10.00。
复制代码
CLOSE DATABASES ALL
CREATE CURSOR MyProducts (ProdID I , ProdCategory I NULL, MSRP Y NULL)
INSERT INTO MyProducts VALUES (1,9,1.00)
INSERT INTO MyProducts VALUES (2,8,2.00)
INSERT INTO MyProducts VALUES (3,7,3.00)
CREATE CURSOR MyUpdates (ProdID I , MSRP Y)
INSERT INTO MyUpdates VALUES (1,.50) && 匹配并更新.
INSERT INTO MyUpdates VALUES (2,20.00) && 匹配并更新.
INSERT INTO MyUpdates VALUES (4,40.00) && 不匹配
INSERT INTO MyUpdates VALUES (1,10.00)&& 第二次匹配,但不更新.
UPDATE MyProducts SET MSRP=MyUpdates.MSRP FROM MyUpdates WHERE MyProducts.ProdID=MyUpdates.ProdID
SELECT MyProducts
BROWSE
2012-10-13 12:58
cxzbzgz
Rank: 8Rank: 8
来 自:云南楚雄
等 级:贵宾
威 望:24
帖 子:298
专家分:808
注 册:2012-6-15
收藏
得分:0 
只更新金额,不更新单价的话,只一条命令就够了:
USE books
UPDATE 金额 SET=books.册数*tjd.单价 WHERE book1.书名=tjd.书名

学习交流VFP,QQ:248561326。
2012-10-13 13:43
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
以下是引用cxzbzgz在2012-10-13 13:43:01的发言:

只更新金额,不更新单价的话,只一条命令就够了:
USE books
UPDATE 金额 SET=books.册数*tjd.单价 WHERE book1.书名=tjd.书名
代码是否经过验证
2012-10-13 14:12
cxzbzgz
Rank: 8Rank: 8
来 自:云南楚雄
等 级:贵宾
威 望:24
帖 子:298
专家分:808
注 册:2012-6-15
收藏
得分:0 
SELECT 1
 USE books
  INDEX on 书名 TO 书名
SELECT 2
 USE tjd  
GO TOP
 DO whil NOT EOF()
  msm=书名
  mdj=单价
   SELECT 1
    SEEK msm  
     REPLACE 单价 WITH mdj
     REPLACE 金额 WITH 册数*单价
    SELECT 2
   SKIP
  ENDDO

学习交流VFP,QQ:248561326。
2012-10-13 16:00
ycvf
Rank: 2
等 级:论坛游民
帖 子:210
专家分:56
注 册:2012-8-25
收藏
得分:0 
以下是引用cxzbzgz在2012-10-13 16:00:49的发言:

SELECT 1
 USE books
  INDEX on 书名 TO 书名
SELECT 2
 USE tjd  
GO TOP
 DO whil NOT EOF()
  msm=书名
  mdj=单价
   SELECT 1
    SEEK msm  
     REPLACE 单价 WITH mdj
     REPLACE 金额 WITH 册数*单价
    SELECT 2
   SKIP
  ENDDO
运行程序通过,但是再次更改jd表内容后(增加一记录),再运行以上程序,books表就无法更新

落花人独立,微雨燕双飞。
2012-10-17 17:29
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:2 
sele 1
use tjd
scan
UPDATE book1 SET=单价=tjd.单价,金额=册数*单价 WHERE book1.书名=tjd.书名
ends
2012-10-17 18:22
快速回复:数据表之间的关联更新问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019265 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved