按照语法写怎么执行不了。例如:有以下临时表T1,T2create cursor T1 (id c (10))sele t1appe blankreplace i
按照语法写怎么执行不了。 例如:有以下临时表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"
下面是我按语法写的几个删除的代码,都执行不了 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语句
[解决办法] 第一种语法是为兼容以前各版本 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 能够更快更有效处理数据的原因之一,其他编程语言是没有这种特性的。