update同时更新多条记录

叶落伤城1 2015-09-04 06:49:35
最近写SQL,碰到一个这样的问题,不太会写,问下各位
情景是这样的,现在有A表和A1表,两个表结构一模一样,A1表比如有100条数据,A表有10条数据,现在需要将A1表所有数据搞到A表里去,没有的INSERT进去(90条),这个已经搞定了,如果A表有的,A1表要把这些数据更新进去(10条),UPDATE能不能写出来一条语句,直接将这10条更新掉?我自己写的,不对~~根据主键判断是否更新还是插入,插入好说简单,这个更新,怎么弄呢?我下面的语句,会有单行子查询返回多行的问题~~
UPDATE A
SET (DEALID,
ORDERID,
NAME,
DBCOLUMNNAME,
DATATYPE,
DATALENGTH,
SCALE,
CSID,
ISPRIMARY,
ISRESERVE,
GUID,
STATUS,
DBVERSION,
DEFAULTVALUE,
ISLOGICKEY,
DEID)
=(SELECT DEALID,
ORDERID,
NAME,
DBCOLUMNNAME,
DATATYPE,
DATALENGTH,
SCALE,
CSID,
ISPRIMARY,
ISRESERVE,
GUID,
STATUS,
DBVERSION,
DEFAULTVALUE,
ISLOGICKEY,
DEID
FROM A1
WHERE EXISTS
(SELECT 1
FROM A
WHERE A1.GUID = A.GUID
AND A1.DEALID = A.DEALID))
...全文
1306 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶落伤城1 2015-09-14
  • 打赏
  • 举报
回复
引用 1 楼 guangtime 的回复:
你逻辑判断问题,应该是这样: UPDATE A SET (DEALID, ORDERID, NAME, DBCOLUMNNAME, DATATYPE, DATALENGTH, SCALE, CSID, ISPRIMARY, ISRESERVE, GUID, STATUS, DBVERSION, DEFAULTVALUE, ISLOGICKEY, DEID) =(SELECT DEALID, ORDERID, NAME, DBCOLUMNNAME, DATATYPE, DATALENGTH, SCALE, CSID, ISPRIMARY, ISRESERVE, GUID, STATUS, DBVERSION, DEFAULTVALUE, ISLOGICKEY, DEID FROM A1 WHERE A1.GUID = A.GUID AND A1.DEALID = A.DEALID ) WHERE EXISTS (SELECT 1 FROM A WHERE A1.GUID = A.GUID AND A1.DEALID = A.DEALID))
你说的是对的,我是写错了语句,没有对结果集进行筛选。。谢谢各位拉!
mayanzs 2015-09-06
  • 打赏
  • 举报
回复
用merge好,功能强、效率高。
惑先生 2015-09-06
  • 打赏
  • 举报
回复
在做MERGE的时候,如果数据量很大,建议现将using子句中的结果先insert到一张临时表中,这样效率会高很多,因为USING中如果涉及到逻辑处理,IO的开销会非常的大
烟落在雪里 2015-09-06
  • 打赏
  • 举报
回复
merge into 简单易用 merge into A Using A1 on ( A1.GUID = A.GUID AND A1.DEALID = A.DEALID)
卖水果的net 2015-09-05
  • 打赏
  • 举报
回复

--  可以考虑使用 merge 

SQL> create table a1(id int , v1 int , v2 int);
Table created
SQL> create table a (id int , v1 int , v2 int);
Table created
SQL> begin
  2    insert into a1 values(1,11,21) ;
  3    insert into a1 values(2,12,22) ;
  4    insert into a1 values(3,13,23) ;
  5    insert into a1 values(4,14,24) ;
  6  
  7    insert into a values(1,111,121) ;
  8    insert into a values(2,121,222) ;
  9    commit ;
 10  end ;
 11  /
PL/SQL procedure successfully completed
SQL> select * from a1 ;
        ID         V1         V2
---------- ---------- ----------
         1         11         21
         2         12         22
         3         13         23
         4         14         24
SQL> select * from a ;
        ID         V1         V2
---------- ---------- ----------
         1        111        121
         2        121        222
SQL> merge into a using a1 on (a.id = a1.id)
  2  when matched then
  3    update set a.v1 = a1.v1,a.v2 = a1.v2
  4  when not matched then
  5    insert (id,v1,v2) values(a1.id,a1.v1,a1.v2);
4 rows merged
SQL> /
4 rows merged
SQL> select * from a1 ;
        ID         V1         V2
---------- ---------- ----------
         1         11         21
         2         12         22
         3         13         23
         4         14         24
SQL> select * from a ;
        ID         V1         V2
---------- ---------- ----------
         1         11         21
         2         12         22
         4         14         24
         3         13         23
SQL> drop table a1 purge ;
Table dropped
SQL> drop table a purge ;
Table dropped

guangtime 2015-09-05
  • 打赏
  • 举报
回复
你逻辑判断问题,应该是这样: UPDATE A SET (DEALID, ORDERID, NAME, DBCOLUMNNAME, DATATYPE, DATALENGTH, SCALE, CSID, ISPRIMARY, ISRESERVE, GUID, STATUS, DBVERSION, DEFAULTVALUE, ISLOGICKEY, DEID) =(SELECT DEALID, ORDERID, NAME, DBCOLUMNNAME, DATATYPE, DATALENGTH, SCALE, CSID, ISPRIMARY, ISRESERVE, GUID, STATUS, DBVERSION, DEFAULTVALUE, ISLOGICKEY, DEID FROM A1 WHERE A1.GUID = A.GUID AND A1.DEALID = A.DEALID ) WHERE EXISTS (SELECT 1 FROM A WHERE A1.GUID = A.GUID AND A1.DEALID = A.DEALID))

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧