一个用SQL更新数据表很菜的问题

时间:2020-12-29 12:18:46
有一个表,表名为A,另有一表,表名为A_HIS。它们都有BranchNO、ReportDate、LastBalance、NowBalance等字段我想用A_HIS表中的某个字段的内容替换到A表中,条件是A表的BranchNO要等于A_HIS中的BranchNO且A_HIS中的ReportDate要等于一个指定值,该值用参数指导定。我写了下面的代码,执行时出错!提示说“至少有一个参数没有被指定值”,请问我的代码哪有问题??请指教!
  .......
  .......
with AdoQuery1 do
  begin
  close;
  sql.Clear ;
  sql.Add('Update A set LastBalance=A_his.NowBalance ');
  sql.Add('where BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA');
  Parameters.ParamByName('mLdateA').Value :=StrToDate(mLdate);
    Execsql;
  end;
  ........
  ........

21 个解决方案

#1


--------------
不能使用.value
直接使用字段名ReportDate

#2


ParamByName('ReportDate').AsDate:=mLDataA
这样对么

#3


应该是SQL语句错误,写成这样应该没
update a set LastBalance=(select LastBalance from A_his where A_his.BranchNO=A.BranchNO and A_his.ReportDate=:mLdateA)

#4


不对,是你负值语句的问题,
ParamByName('ReportDate').AsDate:=mLDataA
这么些就可以了

#5


To iceshape
   用你的推荐仍是出现同样的错误。:(
To 哭沙、Jency
   我用的是AdoQuery,它的参数附值方法和Query的附值方法不同。:(
To 新新虫
   能写写你用的代码吗?谢谢!! 

#6


To iceshape:
   用你的方法出现的错误是:“操作必须使用一个事更新的查询”!!

#7


我现在的解决方法是先把A_HIS中的表中满足ReportDate的数据先放到一个AdoQueryTemp中,然后对A表进行循环,逐个与AdoQueryTemp中的数据进行匹配,这样能实现我的要求,可是较慢,若数据量很大时………… 天哪!!那不知道会要等多久,有没有好办法呀?难道用一条SQL语句不能解决吗??
盼请指教!!!

#8


我也遇到过相同问题。主要是Delphi出问题。
你可以手工修改Paramter参数(在对象面板上),主要参数长度(Size)和类型
(type).

#9


谢谢zxkid!
   可你是怎么实现的呢?我一直以为是SQL的问题,因为以前我用VB写程序的时候就遇到过这类似的问题,也没有办法解决,可能是我动脑不够吧,可实在是想不出来了。
:(

#10


就算更新了A表,也只更新第一条记录………………

#11


对不起是我没看清楚。

  sql.Add('Update A set LastBalance=A_his.NowBalance ');
  sql.Add('from a_His,a where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA');

#12


To zxkid:
   还是有问题啊,update命令里面是没有...from <表>...这样的写法的啊,这样的写法对SQL来说是非法的,程序也这样提示。若去掉from a_his,a 则提示“至少有一个参数未指定值”

#13


什么数据库?
  sql.Add('Update A set LastBalance=A_his.NowBalance');
  sql.Add(where exists(select * from A_his where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA)');
再试试

#14


To zxkid
Access 数据库
用你刚才的建议,仍是出现“至少有一个参数未指定值”的提示,我想应该是delphi中,不能写a_his.BranchNO之类的语句吧,deplphi可能会把BranchNO当成a_his的一个属性而不是字段。
 :(:(((((

#15


1、可能是Delphi的问题。在对象面板上设置Adoquery的Paramters属性,看看有没有参数,核对参数是否正确。如name是否是mLdateA,字段长度和类型是否与数据库的A_his.ReportDate字段相匹配。
2、如果还不行。只有不用参数了,直接写SQL语句也一样啊。如下:
sql.Add('Update A set LastBalance=A_his.NowBalance');
sql.Add(where exists(select * from A_his where a.BranchNO=A_his.BranchNO');
sql.Add('and A_his.ReportDate=''#'+datetostr(日期字段)+'#'')');

#16



可是错误还是出现,报告说“参数A_his.NowBalance没有默认值”!百思不得其解…………………………

#17


这些是Access中的表 
A表:
--------------------------------------
BranchNO    Lastbalance    ReportDate
--------------------------------------
A001                 0     2002-10-01
A002                 0     2002-10-01
A003                 0     2002-10-01
A004                 0     2002-10-01
A005                 0     2002-10-01
A006                 0     2002-10-01
A007                 0     2002-10-01
A008                 0     2002-10-01
A009                 0     2002-10-01
A010                 0     2002-10-01
--------------------------------------

A_HIS表:
--------------------------------------
BranchNO    Nowbalance    ReportDate
--------------------------------------
A001               100     2002-9-30
A002               100     2002-9-30
A003               200     2002-9-30
A004               200     2002-9-30
A005                 0     2002-9-30
A006               100     2002-9-30
A007               100     2002-9-30
A008               200     2002-9-30
A009               200     2002-9-30
A010                 0     2002-9-30
--------------------------------------


通过一条SQL语句将A表变成如下表所示:
--------------------------------------
BranchNO    Lastbalance    ReportDate
--------------------------------------
A001               100     2002-10-01
A002               100     2002-10-01
A003               200     2002-10-01
A004               200     2002-10-01
A005                 0     2002-10-01
A006               100     2002-10-01
A007               100     2002-10-01
A008               200     2002-10-01
A009               200     2002-10-01
A010                 0     2002-10-01
--------------------------------------
我的头都大了……:(((((((((((::((((((((

#18


试试这样的SQL语句:
update a set lastbalance =(select Nowbalance from a_his where branchno=a.branchno and reportdate=‘2002-10-01’)

#19


To b51:
  还是提示"操作必须是一个可更新的查询。"
  失败了………………

#20


是你的最后赋值错误了!你应该安上面的说法仔细认真去核对!

#21


在Access里面update语句应该如此:
with AdoQuery1 do
  begin
  close;
  sql.Clear ;
  sql.Add('Update A,A_his set a.LastBalance=A_his.NowBalance ');
  sql.Add('where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA');
  Parameters.ParamByName('mLdateA').Value :=StrToDate(mLdate);
    Execsql;
  end;
你再试试看!
  

#1


--------------
不能使用.value
直接使用字段名ReportDate

#2


ParamByName('ReportDate').AsDate:=mLDataA
这样对么

#3


应该是SQL语句错误,写成这样应该没
update a set LastBalance=(select LastBalance from A_his where A_his.BranchNO=A.BranchNO and A_his.ReportDate=:mLdateA)

#4


不对,是你负值语句的问题,
ParamByName('ReportDate').AsDate:=mLDataA
这么些就可以了

#5


To iceshape
   用你的推荐仍是出现同样的错误。:(
To 哭沙、Jency
   我用的是AdoQuery,它的参数附值方法和Query的附值方法不同。:(
To 新新虫
   能写写你用的代码吗?谢谢!! 

#6


To iceshape:
   用你的方法出现的错误是:“操作必须使用一个事更新的查询”!!

#7


我现在的解决方法是先把A_HIS中的表中满足ReportDate的数据先放到一个AdoQueryTemp中,然后对A表进行循环,逐个与AdoQueryTemp中的数据进行匹配,这样能实现我的要求,可是较慢,若数据量很大时………… 天哪!!那不知道会要等多久,有没有好办法呀?难道用一条SQL语句不能解决吗??
盼请指教!!!

#8


我也遇到过相同问题。主要是Delphi出问题。
你可以手工修改Paramter参数(在对象面板上),主要参数长度(Size)和类型
(type).

#9


谢谢zxkid!
   可你是怎么实现的呢?我一直以为是SQL的问题,因为以前我用VB写程序的时候就遇到过这类似的问题,也没有办法解决,可能是我动脑不够吧,可实在是想不出来了。
:(

#10


就算更新了A表,也只更新第一条记录………………

#11


对不起是我没看清楚。

  sql.Add('Update A set LastBalance=A_his.NowBalance ');
  sql.Add('from a_His,a where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA');

#12


To zxkid:
   还是有问题啊,update命令里面是没有...from <表>...这样的写法的啊,这样的写法对SQL来说是非法的,程序也这样提示。若去掉from a_his,a 则提示“至少有一个参数未指定值”

#13


什么数据库?
  sql.Add('Update A set LastBalance=A_his.NowBalance');
  sql.Add(where exists(select * from A_his where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA)');
再试试

#14


To zxkid
Access 数据库
用你刚才的建议,仍是出现“至少有一个参数未指定值”的提示,我想应该是delphi中,不能写a_his.BranchNO之类的语句吧,deplphi可能会把BranchNO当成a_his的一个属性而不是字段。
 :(:(((((

#15


1、可能是Delphi的问题。在对象面板上设置Adoquery的Paramters属性,看看有没有参数,核对参数是否正确。如name是否是mLdateA,字段长度和类型是否与数据库的A_his.ReportDate字段相匹配。
2、如果还不行。只有不用参数了,直接写SQL语句也一样啊。如下:
sql.Add('Update A set LastBalance=A_his.NowBalance');
sql.Add(where exists(select * from A_his where a.BranchNO=A_his.BranchNO');
sql.Add('and A_his.ReportDate=''#'+datetostr(日期字段)+'#'')');

#16



可是错误还是出现,报告说“参数A_his.NowBalance没有默认值”!百思不得其解…………………………

#17


这些是Access中的表 
A表:
--------------------------------------
BranchNO    Lastbalance    ReportDate
--------------------------------------
A001                 0     2002-10-01
A002                 0     2002-10-01
A003                 0     2002-10-01
A004                 0     2002-10-01
A005                 0     2002-10-01
A006                 0     2002-10-01
A007                 0     2002-10-01
A008                 0     2002-10-01
A009                 0     2002-10-01
A010                 0     2002-10-01
--------------------------------------

A_HIS表:
--------------------------------------
BranchNO    Nowbalance    ReportDate
--------------------------------------
A001               100     2002-9-30
A002               100     2002-9-30
A003               200     2002-9-30
A004               200     2002-9-30
A005                 0     2002-9-30
A006               100     2002-9-30
A007               100     2002-9-30
A008               200     2002-9-30
A009               200     2002-9-30
A010                 0     2002-9-30
--------------------------------------


通过一条SQL语句将A表变成如下表所示:
--------------------------------------
BranchNO    Lastbalance    ReportDate
--------------------------------------
A001               100     2002-10-01
A002               100     2002-10-01
A003               200     2002-10-01
A004               200     2002-10-01
A005                 0     2002-10-01
A006               100     2002-10-01
A007               100     2002-10-01
A008               200     2002-10-01
A009               200     2002-10-01
A010                 0     2002-10-01
--------------------------------------
我的头都大了……:(((((((((((::((((((((

#18


试试这样的SQL语句:
update a set lastbalance =(select Nowbalance from a_his where branchno=a.branchno and reportdate=‘2002-10-01’)

#19


To b51:
  还是提示"操作必须是一个可更新的查询。"
  失败了………………

#20


是你的最后赋值错误了!你应该安上面的说法仔细认真去核对!

#21


在Access里面update语句应该如此:
with AdoQuery1 do
  begin
  close;
  sql.Clear ;
  sql.Add('Update A,A_his set a.LastBalance=A_his.NowBalance ');
  sql.Add('where a.BranchNO=A_his.BranchNO and A_his.ReportDate=:mLdateA');
  Parameters.ParamByName('mLdateA').Value :=StrToDate(mLdate);
    Execsql;
  end;
你再试试看!