数据库 一对多删除

seven8090 2012-09-25 05:55:39

Close;
SQL.Clear;
SQL.Text := 'SELECT ID AS ID FROM Piece WHERE Produce =' + IntToStr(PID);
Open;
First;
while not QryYS.Eof do //只能执行一次 不能循环
begin
PIID := FieldByName('ID').AsInteger;
Next;
if PIID > 0 then
begin
Close;
SQL.Clear;
SQL.Text := 'DELETE FROM Dosage WHERE Piece =' + IntToStr(PIID);
ExecSQL;
end;
end;
...全文
137 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaikai_kk 2012-09-27
  • 打赏
  • 举报
回复
一次性刪除,也可以用Exists

SQL.Text:='DELETE FROM Dosage WHERE Piece IN (SELECT ID FROM Piece WHERE Produce =' + IntToStr(PID)+')';
酣酣 2012-09-27
  • 打赏
  • 举报
回复
呵呵!
干嘛要循环呢一条SQL就可以删除掉的!
with tmpQuery do begin
Close;
SQL.Clear;
SQL.Text := 'DELETE FROM Dosage FROM Dosage INNER JOIN Piece ON Dosage.Piece = Piece.PIID WHERE Piece.Produce = ' + IntToStr(PID);
ExecSQL;
end;

seven8090 2012-09-27
  • 打赏
  • 举报
回复
gzzai

ExecSQL;//这句没有记录返回,从而造成循环条件不再成立!

应该怎么改啊 我是菜鸟
seven8090 2012-09-27
  • 打赏
  • 举报
回复
总共3个表 表1 表2 表3
表1和表2 1:n的关系
表2和表3 1:n的关系
E-R图
taste品味 2012-09-26
  • 打赏
  • 举报
回复
先把ID取出来,组装SQL语句,用IN方式,一次招待多条,这样快多了
广州佬 2012-09-25
  • 打赏
  • 举报
回复
总结:估计楼主对开域语句 "with" 的使用没掌握好,如果开域语句有嵌套,或使用这样的方式 "with Qry1,Qry2 do" 时,由于被开域的对象存在相同的方法、属性,就会使得后续的语句无法正确确定前导对象了:如后续语句是 "SQL.Clear;" ,那么,指的是Qry1的呢?还是Qry2的呢?所以,当不是那么熟悉 "with" 语句的使用规范时,尽量不去使用它,如某种场合非用不可,也应弄清它的使用方法再去使用。

广州佬 2012-09-25
  • 打赏
  • 举报
回复
原因分析:
  Close;
SQL.Clear;
SQL.Text := 'SELECT ID AS ID FROM Piece WHERE Produce =' + IntToStr(PID);
Open;
First;
while not QryYS.Eof do //这里以未到记录尽头为条件进行循环
begin
PIID := FieldByName('ID').AsInteger;
Next;
if PIID > 0 then
begin
//像楼上朋友所说,这里应该使用另外一个数据集!!
Close;
SQL.Clear;
SQL.Text := 'DELETE FROM Dosage WHERE Piece =' + IntToStr(PIID);
ExecSQL;//这句没有记录返回,从而造成循环条件不再成立!
end;
end;
缘中人 2012-09-25
  • 打赏
  • 举报
回复
执行两个sql,要用两个query;
否则第二个执行sql语句,第一个就被动变成第二个的结果了

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧