请教几个insert into 语句,迷糊了。
本帖最后由 linlingwei 于 2012-10-05 22:33:26 编辑 insert into temp_mx( id,name,sp_khao,dw,big_num)
select id,name,sp_khao,dw,sum(num)as big_num from ckls group by id,name,sp_khao,dw
我的意思是这样的:
表temp_mx,ckls两个表结构完全一样,
对表ckls进行group by汇总后,进行下面操作:
如果temp_mx表中已经存在相同的id和name,则用 ckls表中的big_num更新表temp_mx的字段big_num,即:temp_mx.big_num=temp_mx.big_num+ckls.big_num
如果temp_mx表中不已经存在相同的id和name,则将 ckls表中的id,name,sp_khao,dw,big_num写入表temp_mx中。
在access和sql server中分别该如何写?
[最优解释]
另外在ACCESS中UPDATE語句與SQL中有所不同,ACCESS中UPDATE語句不支持FROM子句,形式為:
update table1 a ,table2 b
set a.data=a.data+b.data
where a.id=b.id and a.name=b.name
給你一個鏈接作參考:
http://wenku.baidu.com/view/7ee79e778e9951e79b892790.html
[其他解释]
两个问题分开来进行 Insert 或 Update 会不会简单些呢。
[其他解释]
存在相同的记录,则更新
update temp_mx
set big_num=big_num+q.big_num
from temp_mx t join (select id,name,sp_khao,dw,sum(num)as big_num from ckls group by id,name,sp_khao,dw) q on t.id=q.id and t.name=q.name
不存在则插入记录
insert into temp_mx( id,name,sp_khao,dw,big_num)
select id,name,sp_khao,dw,sum(num)as big_num from ckls group by id,name,sp_khao,dw
以上两个语句可放在ADOQuery中执行。这两个语句在Access各SQL SERVER都可。
[其他解释]
呵,第二个语句要加入一个条件
insert into temp_mx( id,name,sp_khao,dw,big_num)
select id,name,sp_khao,dw,sum(num)as big_num from ckls
where id not in (select id from temp_mx) and name not in (select name from temp_mx)
group by id,name,sp_khao,dw
[其他解释]
to Oraclers:
存在相同的记录,则更新
update temp_mx
set big_num=big_num+q.big_num
from temp_mx t join (select id,name,sp_khao,dw,sum(num)as big_num from ckls group by id,name,sp_khao,dw) q on t.id=q.id and t.name=q.name
提示查询错误或操作符丢失
[其他解释]
ADOQuery2.SQL.Add(' and t.sp_name=q.sp_name');
ADOQuery2.ExecSQL ;
[其他解释]
你可以这样
....
ADOQuery1.sql.add('select id,name,sp_khao,dw,big_num from temp_mx');
.....
ADOQuery2.sql.add('select id,name,sp_khao,dw,sum(num)as big_num from ckls group by id,name,sp_khao,dw');
...
while not ADOQuery2.eof do
begin
ADOQuery1.edit;
if ADOQuery1.locate('id;name',vararrayof([ADOQuery1.fiels[0].asstring,ADOQuery1.fiels[1].asstring]),[locaseinsensitive]) then
ADOQuery1.fields[4].asfloat:= ADOQuery1.fiels[4].asfloat+ADOQuery2.fiels[4].asfloat
else
ADOQuery1.appeandrecord([ADOQuery2.fields[0],ADOQuery2.fields[1],ADOQuery2.fields[2]..]);
ADOQuery1.post;
ADOQuery2.next;
end;
[其他解释]
to yuanqingkun0103:
你这个办法我考虑过,还是放弃了,对于少量数据可以,但对于上万条数据的话,效率就太低了,不实用的。
[其他解释]
还是期待Oraclers大侠给出好的方法。
[其他解释]
你可以先将Delphi中的查询语句执行前记录到一个文本上,然后在查询分析器中验证下SQL语句,正确后再写到DELPHI的查询。我看到你下列语句中转换成字符串的日期可能少了单引号。
ADOQuery2.SQL.Add(' where (sh_date >'+date_str(date1.Date)+' and sh_date <'+date_str(date2.Date+1)+')');
改成:
ADOQuery2.SQL.Add(' where (sh_date >'''+date_str(date1.Date)+''' and sh_date <'''+date_str(date2.Date+1)+''')');
[其他解释]
另外注意日期时间转换成字符串后的格式。不管系统中的日期时间格式如何,使用'yyyy-mm-dd hh:nn:ss'样的格式总是可以正确识别(如果不要时间部分,则只格式化成:'yyyy-mm-dd'),所以建议在传日期时间参数时格式化成上述格式。
[其他解释]
to Oraclers:
和时间部分没关系,刚刚在sql 试了一下,用的adoquery:
update temp_kcmove_mx set cgth=cgth+q.cgth from temp_kcmove_mx t join
(select sp_id,sp_name,sum(num) as cgth from ckls
where (sh_date >'1900-01-01' and sh_date <'2012-10-09')
and sh_flag=1 and dj_flag=1106 group by sp_id,sp_name) q on t.sp_id=q.sp_id
and t.sp_name=q.sp_name
提示cgth列名不明确
[其他解释]