例如:有以下临时表T1,T2
create cursor T1 (id c (10))
sele t1
appe blank
replace id with "1"
appe blank
replace id with "2"
appe blank
replace id with "3"
create cursor T2 (id c (10))
sele t2
appe blank
replace id with "1"
appe blank
replace id with "2"
我想删除 T1中ID='1'且 ID也在T2中的记录
下面是DELETE的语法
DELETE
[Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias]
[NOOPTIMIZE]
下面是我按语法写的几个删除的代码,都执行不了
delete all where id='1' and id in (select id from t2)
delete where id='1' and id in (select id from t2)
delete where id='1' and id in (select id from t2) in t1
delete all for id='1' where id in (select id from t2) in t1
delete all for id='1' where id in (select id from t2)
只有下面两个个可以执行:
delete from 't1' where id='1' and id in (select id from t2)
delete from t1 where id='1' and id in (select id from t2)
但delete的语法中没有"from nWorkArea | cTableAlias" 这样的啊。
------解决方案--------------------------------------------------------
下面的是VFP自带的删除语句,不支持SQL嵌套(SELETE... FROM...)。
Append from 也是VFP自带的,而INSERT INTO 则是标准SQL语句
------解决方案--------------------------------------------------------
那个all加上有啥用处,真是不明白!
1)DELETE [Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias] [NOOPTIMIZE]
2)DELETE [Target] FROM [FORCE] Table_List [[, Table_List ...] | [JOIN [ Table_List]]][WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]
你应该用第二个格式,而不是两个格式的混合模式或者是参照第一种语法格式写第二种语句!
------解决方案--------------------------------------------------------
第一种语法是为兼容以前各版本 foxpro/xBase 而保留的语法。
注意其中的关键字 WHILE 和 sql 语法中的 WHERE 是完全不同的。
对于需要主从关联的表操作,老式的语法比较繁琐,需要先用 set order ... 启用从表关联字段上索引,然后在主表上用 set relation to ... 建立(临时性)主从关联,之后才能执行正确的关联操作。
例如像你一楼的示例,用第一种方法来关联删除的话,大概过程是这样的:
create cursor T1 (id c (10))
... 添加记录
create cursor T2 (id c (10))
... 添加记录
index on id tag id
select T1
set order to id in T2
set relation to id into T2
delete for id='1' and T1.id = T2.id
通常情况下,用新式的 sql 删除语法会简化编程并提高运行效率,这只是对初学者而言,因为 vfp 在此情况下会自动搜寻可用搜索并自动优化执行。
但是,在特定情况下,老式语法的执行效率可能比 sql 语法要高得多,这主要出现在使用 WHILE 这个选项的情况下,这是因为 sql 是面向记录集的,不存在记录指针或第x条记录这种概念,而如果你只需要操作一个几十万、上百万条记录的表中特定记录以下100条记录时,老式的语法就可以先 goto/locate/seek 到指定记录,然后用 next x 指定操作范围,并用 while 指定检查条件,一旦条件不合就立即退出,直接忽略掉其后的所有记录,即使他们还在 next x 指定的记录范围内;而 sql 语法却不得不执行一个表扫描,特别是在不存在索引的情况下。这也就是一个 foxpro/vfp 老手与新手的区别之一,也是 vfp 能够更快更有效处理数据的原因之一,其他编程语言是没有这种特性的。