| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1472 人关注过本帖
标题:关于UPDATE的一点问题
只看楼主 加入收藏
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
TonyDeng老师,程序是根据你的:
...
SELECT 0
USE L2
DELETE FOR A3=3
PACK
INDEX ON A3 TAG A1
*SELECT L1
SET RELATION TO A3 INTO L1
....

请你执行一下,看看效果。
2012-02-07 14:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
SET TALK OFF
 SET SAFETY OFF
 SET CENTURY ON
SET EXACT ON
 SET DATE YMD
SET SYSMENU OFF
 CLEAR ALL
 CLOSE DATABASES
* CD D:\BDS
 CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
 FOR X=1 TO 8
 Y=STR(X,1)
 APPEND BLANK
 REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
 ENDFOR
 LIST
COPY TO L2 FOR A3<6
 INDEX ON A3 TAG A1
 SELECT 0
 USE L2
 DELETE FOR A3=3
 PACK
 LIST
 WAIT
 INDEX ON A3 TAG A1
 SELECT L1
 SET RELATION TO A3 INTO L2
 *UPDATE L1 SET L1.A1=L2.A2 from L2 WHERE L1.A3=L2.A3 &&此命令在9.0可以,8.0出错
* UPDATE L1 SET A1 = "u" + L2.A2 WHERE L1.A3=L2.A3
 SELECT L1        && by Tony
 REPLACE ALL L1.A1 WITH "U"+L2.A2 FOR L1.A3=L2.A3  &&此命令在更改关联方法后也不能达到预想的目的
 BROWSE
 RETURN
 

授人以渔,不授人以鱼。
2012-02-07 14:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用上面的代碼測試,那個SQL UPDATE指令無法達到目的,原因應該是SQL把表複製到一個臨時表中操作造成的,因為它不對表直接操作,關聯就失去了作用。

我上面說的兩個工作區,說反了。發出SET RELATION指令的工作區是動作區,INTO那個才是隨動區。即在L1發出SET RELATION指令讓INTO L2中的L2跟隨。

授人以渔,不授人以鱼。
2012-02-07 14:51
lygcw9603
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:233
专家分:357
注 册:2006-8-27
收藏
得分:0 
回复 19楼 panpende
SET TALK OFF
SET SAFETY OFF
SET CENTURY ON
SET EXACT ON
SET DATE YMD
SET SYSMENU OFF
CLEAR ALL
CLOSE DATABASES
*CD D:\BDS
CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
FOR X=1 TO 8
    Y=STR(X,1)
    APPEND BLANK
    REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
ENDFOR
COPY TO L2 FOR A3<6
CLOSE TABLES
SELECT 1
USE L1
SELECT 2
USE L2
FOR I=1 TO RECCOUNT()
    GO I
    SELECT 1
    LOCATE  FOR A.A3=B.A3
    IF FOUND()
       REPLACE A.A1 WITH B.A2
    ENDIF
    SELECT 2
ENDFOR
SELECT 1
BROWSE
RETURN

试试 VFP6.0环境 不需要建索引,只要A3相等即可

[ 本帖最后由 lygcw9603 于 2012-2-7 14:57 编辑 ]
2012-02-07 14:55
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
TonyDeng老师,您在16楼说:SET RELATION指令,是指定當前工作區的數據表指針跟隨INTO參數工作區中的表指針移動,後者動了,本區就動,但本區動,後者不會動。因為你的需要在移動L1記錄指針的時候跟著動L2的,所以在SELECT L2後設置SET RELATION ……INTO L1即可。

在22楼中,你設置
SELECT L1
SET RELATION TO A3 INTO L2

是不是经过探讨,结论是 :
要想达到预想的目的,排序是必要的;SET RELATION TO A3 INTO L2 的关联是正确的;REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3 可以达到预想的目的;UPDATE L1 SET A1 = L2.A2 WHERE L1.A3=L2.A3 是不稳定的。





2012-02-07 15:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
聯動是必須索引的,沒索引只能用24樓那樣的搜索。請見我23樓和你DELETE SQL新帖中的回覆。

授人以渔,不授人以鱼。
2012-02-07 15:06
lygcw9603
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:233
专家分:357
注 册:2006-8-27
收藏
得分:0 
以下是引用panpende在2012-2-7 15:04:41的发言:

TonyDeng老师,您在16楼说:SET RELATION指令,是指定當前工作區的數據表指針跟隨INTO參數工作區中的表指針移動,後者動了,本區就動,但本區動,後者不會動。因為你的需要在移動L1記錄指針的時候跟著動L2的,所以在SELECT L2後設置SET RELATION ……INTO L1即可。

在22楼中,你設置
SELECT L1
SET RELATION TO A3 INTO L2

是不是经过探讨,结论是 :
要想达到预想的目的,排序是必要的;SET RELATION TO A3 INTO L2 的关联是正确的;REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3 可以达到预想的目的;UPDATE L1 SET A1 = L2.A2 WHERE L1.A3=L2.A3 是不稳定的。
排序是为了更好的解决问题,但是为了解决问题,有时候并不需要排序。如果为了探讨问题,有时候自己可以多想想为什么。不当指处请指正。
2012-02-07 15:10
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢lygcw9603关注,要达到目的有许多方法,你的方法应该可行。我在此目的是想探讨8.0中 SQL UPDATE指令,以及它的正确用法。我经常发现我8.0使用SQL UPDATE指令有不稳定的现象,在某些程序段中可以很正常,在某些程序段中会出错。在此论坛我曾经提出过,没有解决疑问,因此出了个例题请老师们指教。
2012-02-07 15:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
具體如何操作是視實際情況而定的,有些動作是索引也無法滿足要求,就只能另想辦法(比如用LOCATE),如果能夠索引,當然最好有索引。數據庫的優化查詢是建立在索引基礎上的,沒有索引,基本上就沒有優化可言。但索引並不總能提高效率,通常在2000條記錄以內,索引是低效的。

授人以渔,不授人以鱼。
2012-02-07 15:16
lygcw9603
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:233
专家分:357
注 册:2006-8-27
收藏
得分:0 
以下是引用panpende在2012-2-7 15:14:28的发言:

谢谢lygcw9603关注,要达到目的有许多方法,你的方法应该可行。我在此目的是想探讨8.0中 SQL UPDATE指令,以及它的正确用法。我经常发现我8.0使用SQL UPDATE指令有不稳定的现象,在某些程序段中可以很正常,在某些程序段中会出错。在此论坛我曾经提出过,没有解决疑问,因此出了个例题请老师们指教。
SET TALK OFF
SET SAFETY OFF
SET CENTURY ON
SET EXACT ON
SET DATE YMD
SET SYSMENU OFF
CLEAR ALL
CLOSE DATABASES
*CD D:\BDS
CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
FOR X=1 TO 8
    Y=STR(X,1)
    APPEND BLANK
    REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
ENDFOR
COPY TO L2 FOR A3<6
CLOSE TABLES
SELECT 1
USE L1
SELECT 2
USE L2
SCAN
   UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3==L2.A3
ENDSCAN
BROWSE
RETURN
VFP 6.0环境下运行正常
我认为能不排序时,尽可能不要排序,这样可以减少不必要的麻烦。
2012-02-07 15:51
快速回复:关于UPDATE的一点问题
数据加载中...
 
   



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

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