请教一个有关TQuery中使用SQL的基本问题。(50分)

  • 主题发起人 主题发起人 lily
  • 开始时间 开始时间
L

lily

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有两个数据表tempsale和annual,现在我想用annual表(nf、yf、spdm、wtsl都是该表中的字段)中满足nf1=<nf<=nf2,yf1<=yf<=yf2,并且annual表的spdm字段值与tempsale表的spdm字段值相同的记录的sum(wtsl)更新tempsale表的相同spdm字段值的记录的wtsl(spdm,wtsl都是tempsale表中的字段).我在query使用如下SQL语句,结果出错,请各位指教一下:

update tempsale
set wtsl=(select sum(annual.wtsl)
from annual
where tempsale.spdm=annual.spdm
and (nf>=:nf1) and (nf<=:nf2)
and (yf>=:yf1) and (yf<=:yf2))
from tempsale,annual
 

????
What do you Want to do!
 
query1.sql.add('select * from annual where nf1=:nf1 and nf<=:nf2'
+'and yf>=:yf1 and yf<=:yf2');
query1.ParamByName('nf1').AsInteger := nf1;
...

query1.open;
 
sorry,我想我忘记换行了。我的问题是这样的:
现在有两个表tempsale(spdm,wtsl)和annual(spdm,nf,yf,wtsl),我现在想
用annual表中满足nf1<=nf<=nf2 and yf1<=yf<=yf2 and annual.spdm=
tempsale.spdm的记录的sum(wtsl)去更新tempsale表中相同spdm字段值的
记录的wtsl字段,我在query中使用了如下的SQL语句,结果出错,请各位指教
错在哪里?
update tempsale
set wtsl=(select sum(annual.wtsl)
from annual
where tempsale.spdm=annual.spdm
and (nf>=:nf1) and (nf<=:nf2)
and (yf>=:yf1) and (yf<=:yf2))
from tempsale,annual
 
你的意思没说清楚,
“中满足nf1==:nf1) and (nf<=:nf2)”
是不是打错了!
是不是应为(nf>=:nf1)and(nf<=:nf2)
也就是要查年份和月份在某段时间内的内容!
我以前也遇到过!
这样做:
...
var s:string;//SQL子句
begin
s:='select * from annual where 1=1 ';
s:=s+'AND (Nf>:YEAR OR (Nf=:YEAR AND Yf>=:MONTH)';
S:=s+'AND (Nf<:YEAR2 OR (Nf=:YEAR2 AND Yf<=:MONTH2) ';
with Query do
begin
close;
sql.clear;
sql.Add(s);
try
open;
except
showmessage('SQL出错!')
end;
end;
end;
试试!!
 
咳!早点说!
害我打了半天
 
update tempsale
set tempsale.wtsl=(select sum(annual.wtsl)
from annual
where tempsale.spdm=annual.spdm
and (nf>=:nf1) and (nf<=:nf2)
and (yf>=:yf1) and (yf<=:yf2)
)

 
select 子句好象少写了一个 tempsale.
加上试试!
 
...
update tempsale
set tempsale.wtsl=(select sum(a.wtsl)
from annual a,tempsale t
where t.spdm=a.spdm
and (a.nf>=:nf1) and (a.nf<=:nf2)
and (a.yf>=:yf1) and (a.yf<=:yf2))
from tempsale,annual
当然别忘了
...
query.ParamByName('nf1').AsInteger := nf1;
query.ParamByName('nf2').AsInteger := nf2;
query.ParamByName('yf1').AsInteger := yf1;
query.ParamByName('yf2').AsInteger := yf2;



 
错!若是比较时间,必须象我这样做!
...
update tempsale
set tempsale.wtsl=(select sum(a.wtsl)
from annual a,tempsale t
where t.spdm=a.spdm
and ((a.nf>:nf1) or (a.nf=:nf1 and a.yf>=:yf1))
and ((a.nf<:nf2) of (a.nf=:nf1 and a.yf<=:yf2))
from tempsale,annual
当然别忘了
...
query.ParamByName('nf1').AsInteger := nf1;
query.ParamByName('nf2').AsInteger := nf2;
query.ParamByName('yf1').AsInteger := yf1;
query.ParamByName('yf2').AsInteger := yf2;

 
非常感谢各位的指点,尤其是lmtree。但是我试着使用各位的建议,但是还是出现了
一样的错误,系统认为SQL语句有错。劳繁各位再给些高见,多谢!
 
>>但是我试着使用各位的建议

我的是过了吗?说实话! :)

Update 语句不需要 From 子句!!

>>但是还是出现了一样的错误

出错信息是什么?

 
你仔细检查一下吧!
我发现自己SELECT子句后少写了一个")"!
UPDATA赋值时只应许唯一值,对于你这个SQL中有SUM
应没问题!
另外,你可以在SQL EXPLOER中测试SQL语句,对nf,yf
先输入具体数试一试!
相信你会成功!!
 
charles说的对!
我也没看出来,UPDATA语句没有FROM 子句!!
 
不过,我试了,加上FROM 子句也不会出错!
lily:
出错信息是什么??
你不会是哄我们吧??!!
另外:
UPDATA 语句要用WHERE子句限制是修改的哪条记录!
不可能对所有记录修改!!
 
我使用的SQL语句如下:
update tempsale
set tempsale.wtsl=(select sum(a.wtsl)
from annual a,tempsale t
where t.spdm=a.spdm
and ((a.nf>:nf1) or (a.nf=:nf1 and a.yf>=:yf1))
and ((a.nf<:nf2) or (a.nf=:nf1 and a.yf<=:yf2)))
from tempsale,annual
出错信息如下:
General SQL error
[Microsoft][ODBC Foxpro 驱动程序]语法错误(操作符丢失)在查询表达式
'(select sum(a.wtsl) from annual a,tempsale t where t.spdm=
a.spdm and ((a.nf>Pa_Ram0000) or (a.nf=Pa_Ram0001 and a.yf>=
Pa_Ram0002)) and ((a.nf<Pa_Ram0003) or (a.nf=Pa_Ram0004 and a.y'
中.
 
lily: 你能不能把你问的其他几个待答问题先接受了再说?
我看那几个问题中大部分已经解决了,不过你似乎没有结束问题的意思.
 
我倒!!!!
把from tempsale,annual那句去掉就可以了:-)
 
多人接受答案了。
 
后退
顶部