标题:下列一条删除代码如何来理介?
只看楼主
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:10 
以下是引用kiff在2015-5-11 15:08:04的发言:

DELETE 用连接是多余的。
可改成这样:
DELETE mycursor1 from mycursor2,mycursor3 where mycursor1.field1>5 and  mycursor1.field1=mycursor2.field1 AND mycursor2.field1= mycursor3.field1
MyCursor2本身就是多余的,条件中出现这个表文件的意义何在?“MyCursor1.Field1=MyCursor2.Field1 AND MyCursor2.Field1=MyCursor3.Field1”不就是“MyCursor1.Field1=MyCursor3.Field1”么?
2015-05-11 15:30
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
以下是引用kiff在2015-5-11 15:08:04的发言:

DELETE 用连接是多余的。
可改成这样:
DELETE mycursor1 from mycursor2,mycursor3 where mycursor1.field1>5 and  mycursor1.field1=mycursor2.field1 AND mycursor2.field1= mycursor3.field1
你的例子是我举的例子的另一种形式,它们都是张洪举的书中的
2015-05-11 15:54
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
摘自:请注意以下红色与兰色标记的二条命令 及产生的结果的一样的。
相互关联的DELETE-SQL命令
Visual FoxPro 9.0现在支持使用DELETE-SQL进行相互关联删除。

如果一个FROM子句中包含有多个表,则DELETE后面的名称是必需的,并且被指定为删除操作的目标,该名称可以是一个表名称、别名或是一个文件名称。DELETE-SQL命令选择目标表的逻辑和FROM子句的语法限制与UPDATE-SQL命令相同,见前面的介绍。

下面是相互关联DELETE命令的语法格式:

DELETE [alias] FROM alias1 [, alias2 … ] … WHERE …

参考下列代码:

CREATE CURSOR MyCursor1 (field1 I , field2 I NULL,field3 I NULL)

INSERT INTO MyCursor1 VALUES (1,1,0)

INSERT INTO MyCursor1 VALUES (2,2,0)

INSERT INTO MyCursor1 VALUES (5,5,0)

INSERT INTO MyCursor1 VALUES (6,6,0)

INSERT INTO MyCursor1 VALUES (7,7,0)

INSERT INTO MyCursor1 VALUES (8,8,0)

INSERT INTO MyCursor1 VALUES (9,9,0)

CREATE CURSOR MyCursor2 (field1 I , field2 I)

INSERT INTO MyCursor2 VALUES (1,10)

INSERT INTO MyCursor2 VALUES (2,20)

INSERT INTO MyCursor2 VALUES (3,30)

INSERT INTO MyCursor2 VALUES (4,40)

INSERT INTO MyCursor2 VALUES (5,50)

INSERT INTO MyCursor2 VALUES (6,60)

INSERT INTO MyCursor2 VALUES (7,70)

INSERT INTO MyCursor2 VALUES (8,80)

CREATE CURSOR MyCursor3 (field1 I , field2 I)

INSERT INTO MyCursor3 VALUES (6,600)

INSERT INTO MyCursor3 VALUES (7,700)

DELETE MyCursor1 FROM MyCursor2 ;

WHERE MyCursor1.field1>5 AND MyCursor2.field1=MyCursor1.field1

SELECT MyCursor1

LIST OFF

RECALL ALL &&撤消删除

DELETE MyCursor1 FROM MyCursor2, MyCursor3 ;

WHERE MyCursor1.field1>5 AND MyCursor2.field1=MyCursor1.field1 AND MyCursor2.field1=MyCursor3.field1

SELECT MyCursor1

LIST OFF

RECALL ALL

DELETE FROM MyCursor1 WHERE MyCursor1.field1>5

SELECT MyCursor1

LIST OFF

RECALL ALL

DELETE MyCursor1 from MyCursor1 WHERE MyCursor1.field1>5

RECALL ALL IN MyCursor1

DELETE T1 ;

FROM MyCursor1 T1 JOIN MyCursor2 ON T1.field1>5 AND MyCursor2.field1=T1.field1, MyCursor3 ;

WHERE MyCursor2.field1=MyCursor3.field1

RECALL ALL IN MyCursor1

执行上述代码,几次删除的结果如图8-38所示(记录前的“*”表示该记录被添加了删除标记)。读者如果对DELETE命令中的FROM子句理解起来比较困难,也可以参考前面在UPDATE命令中介绍的方法,把FROM子句转换到SELECT中来获取查询结果,进行分析。

二条命令的结果是一样的。
请问红色标记的命令中MyCursor3 及,(逗号)前面的语句成何关系?

[ 本帖最后由 sylknb 于 2015-5-11 16:17 编辑 ]
2015-05-11 16:08
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
得分:0 
SELECT 可用到的 LEFT ,RIGHT,FULL 连接有用处外,其它的SQL(如:DELETE)不必要用到连接。用INNER连接更是多此一举.

 
2015-05-11 16:25
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
得分:10 
以下是引用sylknb在2015-5-11 16:08:08的发言:


二条命令的结果是一样的。
请问红色标记的命令中MyCursor3 及,(逗号)前面的语句成何关系?
前面是用ON 把两表联系起来,然后再通过 WHERE 让MyCursor2与MyCursor3关联,这样三个表就关联了。本来就是用 WHERE 就可以关联三个表的,而用了 ON 反而难以清晰。
2015-05-11 16:40
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
以下是引用kiff在2015-5-11 16:40:33的发言:

前面是用ON 把两表联系起来,然后再通过 WHERE 让MyCursor2与MyCursor3关联,这样三个表就关联了。本来就是用 WHERE 就可以关联三个表的,而用了 ON 反而难以清晰。
如用了on 使人理介为 MyCursor1与MyCursor2联接为一个中间表,然后这个中间表再与MyCursor3 关联。

DELETE T1 ;

FROM MyCursor1 T1 JOIN MyCursor2 ON T1.field1>5 AND MyCursor2.field1=T1.field1, MyCursor3 ;

WHERE MyCursor2.field1=MyCursor3.field1

( T1 JOIN MyCursor2 ON T1.field1>5 AND MyCursor2.field1=T1.field1,变成中间表)
2015-05-11 17:07
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
张洪举的书中我没看过DELETE-SQL部分,我觉得他如此举例只是为了说明在该语句中如何运用表文件的关联,而不是让我们去绕弯用。事实上,任何程序猿写代码时,在自己思路可及范围内,都会选择最简洁的语法去达到操作目的。
2015-05-12 07:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-445060-1-1.html




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

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