首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请问几个insert into 语句,迷糊了

2012-12-26 
请教几个insert into 语句,迷糊了。本帖最后由 linlingwei 于 2012-10-05 22:33:26 编辑insert into temp_m

请教几个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  

提示查询错误或操作符丢失
[其他解释]

引用:
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 an……


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列名不明确
[其他解释]

引用:
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' a……

那你看下你的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中执行的
[其他解释]

引用:
to Oraclers:
现在又语法错误或操作符丢失。

你把在SQL查詢分析器運行的語句及錯誤信息原封不動貼出來,我看看。
[其他解释]
引用:
我在access中执行的

先在SQL執行看是否有錯,如果在SQL無錯的話,證明語句無錯。
在ACCESS中主要是日期格式的問題,因ACCESS使用較少,好象是在日期前後需要加上#,格式為:'#yyyy-mm-dd#'

热点排行