请教几个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
提示查询错误或操作符丢失
[其他解释]
sum(num)as big_num 昨天复制你原来的,)as之间应有一个空格,改为: sum(num) as big_num
[其他解释]
to Oraclers:
我加空格了,加空格也出现上面提示,我把源码贴出来你看看
ADOQuery2.Close ;
ADOQuery2.SQL.Clear ;
ADOQuery2.SQL.Add(' update temp_kcmove_mx set cgth=cgth+q.cgth from temp_kcmove_mx t join');
ADOQuery2.SQL.Add(' (select sp_id,sp_name,sum(num) as cgth from ckls');
ADOQuery2.SQL.Add(' where (sh_date >'+date_str(date1.Date)+' and sh_date <'+date_str(date2.Date+1)+')');
ADOQuery2.SQL.Add(' and sh_flag=1 and dj_flag=1106 group by sp_id,sp_name) q on t.sp_id=q.sp_id');
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列名不明确
[其他解释]
那你看下你的temp_kcmove_mx表中是否有这个列名,并注意大小写。
[其他解释]
to Oraclers:
我说错了,提示是 列名cgth 不明确
[其他解释]
update temp_kcmove_mx set cgth=t.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
将...set cgth=cgth+q.cgth ....改成 ...set cgth=t.cgth+q.cgth...
------其他解决方案--------------------
to Oraclers:
现在又语法错误或操作符丢失。
[其他解释]
我在access中执行的
[其他解释]
你把在SQL查分析器行的句及信息原封不出,我看看。
[其他解释]
先在SQL行看是否有,如果在SQL的,明句。
在ACCESS中主要是日期格式的,因ACCESS使用少,好象是在日期前後需要加上#,格式:'#yyyy-mm-dd#'