delphi bde-sql问题:删除paradox表指定内容(200分)

  • 主题发起人 主题发起人 jenhon
  • 开始时间 开始时间
J

jenhon

Unregistered / Unconfirmed
GUEST, unregistred user!
正在做一个货品的质量控制的软件,客户那边的数据都是用paradox的db存的,现在看能不能用一个sql语句一次性删除一个表里面的若干记录,要删除的内容已经在一个对照表里面写好了,不只一个删除条件。
Table1(原表):
A B C D ....
1 x abc xxxx
3 y cde xxx
4 z efg xxxxx
2 a abc xxx
4 x xyz xxxx
3 y cde xx
Table2(对照表)
A B C
3 y cde
2 a abc

按照对照表,要删除第2、4、6条记录,因为这几条记录都符合对照表的条件要求。

如上例,现求能符合BDE标准的(而不是MSSQL、ACCESS的)、能做到以上动作的sql语句。

(不想用循环去删,原表有20多万条记录,对照表有4万多,一条一条删会慢到吓人,只能寄希望用SQL了。)

谢谢!

(最好自己先执行看看能不能正常删除再回贴,BDE-SQL实在太烂了....)
 
paradox是桌面面数据库中数度最快的,比ACCESS快10倍以上,我曾经做过一个奖票管理程序,产生100万组数据也不过几分钟时间。paradox的sql我还从来没用过。
另外从来不存在BDE标准的SQL,BDE只是把你SQL语句原样传递给数据库,因此要找paradox的SQL语法。就是普通标准SQL 试试这个语句
DELETE Table1
FROM Table1 INNER JOIN Table2
ON Table1.a= Table2.a
Table1.b= Table2.b
Table1.C= Table2.C
不保证正确
 
[red](最好自己先执行看看能不能正常删除再回贴,BDE-SQL实在太烂了....)[/red]
没有你的数据库怎么删啊
 
怎么会不存在着BDE的SQL标准?楼上能不能测试一下再说?

对于BDE的SQL 您的语句就没法通过:DELETE TABLE1 FROM ....
这样的结构,BDE是不认识的。
我试过你的语句了,BDE报错:Invalid use of keyword.

同样,就算最简单的多重SELECT,BDE也是没法判断的,比如:
SELECT A.A,B.B
FROM A,(SELECT B FROM C) B
WHERE A.B=B.B
这样的标准SQL语句,BDE都没办法认识到,直接指出在第二个select那里是语法错误。

谢谢。

楼下继续,帮帮忙啊。
 
"来自:网中戏, 时间:2006-10-16 17:30:26, ID:3597928
[red](最好自己先执行看看能不能正常删除再回贴,BDE-SQL实在太烂了....)[/red]
没有你的数据库怎么删啊"

用我给的那几行数据,就可以测试啊。
 
晕死,怎么都是看看就过了呢?
真的没法解决吗?

高手高手呢?
 
难道非得学shm520老兄,把标题改成:
冰天雪地背插尖刀裸体后空翻转7200度跪求还送200大洋!BDE-SQL批量删除问题

??
 
上去.....


在线等啊...
 
你可以用这样的语法来完成操作。(delphi自带SQL Explorer工具测试通过)
delete from table1 where table1.a in (select a from table2)
 
来自:wonder_520, 时间:2006-10-17 17:50:03, ID:3598971
你可以用这样的语法来完成操作。(delphi自带SQL Explorer工具测试通过)
delete from table1 where table1.a in (select a from table2)

谢谢 wonder_520,可是不行啊,因为条件可不止一个啊,而table1.a in (select a from table2) AND table1.b in (select b from table2) ....逻辑上就是错的,因为有可能错行命中了纪录而误删。
 
说白了,我就是想要把这句话看能怎么转换合法的、BDE能认识的:
DELETE FROM TABLE1
WHERE
(TABLE1.A,TABLE1.B,TABLE1.C) IN (SELECT A,B,C FROM TABLE2)

当然上面这句是语法错误的,IN只能一列对比。
 
为什么不愿意用循环?想用一个语句完成这种功能不可行啊~
 
“来自:一只菜鸟Olala, 时间:2006-10-18 10:09:38, ID:3599413
为什么不愿意用循环?想用一个语句完成这种功能不可行啊~ ”

谢谢。

循环要40多个钟头啊,我已经在我这边做了全测试,64位的机器。
客户那边不允许运行这么长时间啊,而且还是32位的赛扬机。
 
循环要40几个钟头? 不太可能吧!把你对照表做为主表,原表作为从表,这样所有记录都在内存中,删除也是(删除时一定要关掉数据源和界面的联系),我想顶天30分钟完成。paradox在本机桌面的数度是 非常非常快的。
 
20多w条原记录 对应4w条记录啊,老兄,怎么可能那么快.....

循环的话,是在4w条记录里面找1条,找20w次,或者在20w条记录里面找1条,找4w次......能快吗?
 
另外,对照表即删除条件是5个字段,原表是30多个字段。
 
http://www.feiyang.net.cn
 
楼上是什么意思,陌生的连接,一般没人会去点的。

这个连接,我在DFW已经不止一次看到你放出来,如果是想放马,劝你还是省点吧。
如果是解决方法,你至少得给点文字说明啊。
 
取巧一下
delete from table1 where table1.a+table1.b+table1.c in (select a+b+c from table2)

呵呵,得是字符串啊。
 
上面的语句在ACCESS或者MSSQL应该可以,但是BDE不行啊。
况且需要中间的变量名使到列对应,BDE不行啊。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部