ºìÁªLinuxÃÅ»§
Linux°ïÖú

oracleÖÐÓÐupdate¡­from½á¹¹Âð£¿

·¢²¼Ê±¼ä:2008-05-24 00:02:01À´Ô´:ºìÁª×÷Õß:Relief
ºÜ¶àÊìϤSQL serverµÄÅóÓÑÔÚ½Ó´¥µ½oracleµÄʱºò¾­³£·¸µÄÒ»¸ö´íÎó¾ÍÊÇ×ÜÒÔΪoracleÖÐÒ²»áÓÐupdate fromÕâÖֽṹ¡£ÇëÄãËÀÁËÕâÌõÐÄ°É£¬ÔÚoracleÖеÄupdateÓï¾äÖв»´æÔÚfromÓï¾ä¡£

Ç°ÃæÎÒÃǼòµ¥½éÉܹýOracleµÄupdateÓï¾ä¡£ÕâÀïÎÒÃÇÖصã½éÉÜÈç¹û»ùÓÚ±ðµÄ±íÀ´¸üе±Ç°±íµÄupdateÓï·¨¡£

ÎÒÃÇÖªµÀÔÚoracleÖеÄÀý×ÓÊý¾Ý¿âÖÐÓÐÃûΪscottµÄschema,ÀïÃæÓÐÒ»¸ö±íÊÇemp£¬ÎÒÃǾÍÄÃÕâÀï±íÀ´¾ÙÀý

ÏȽ¨Á¢Ò»¸ö½á¹¹Ò»Ä£Ò»ÑùµÄ±íemp1£¬²¢ÎªÆä²åÈ벿·ÖÊý¾Ý

create table emp1
as
select * from emp where deptno = 20;

updateµôemp1ÖеIJ¿·ÖÊý¾Ý
update emp1
set sal = sal + 100,
comm = nvl(comm,0) + 50

È»ºóÎÒÃÇÊÔ×ÅʹÓÃemp1ÖÐÊý¾ÝÀ´¸üÐÂempÖÐsal ºÍ commÕâÁ½ÁÐÊý¾Ý¡£

ÎÒÃÇ¿ÉÒÔÕâôд
Update emp
Set(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)
Where exists (select 1 from emp1 where emp1.empno = emp.empno)

ÇëÄãÓÈÆä×¢ÒâÕâÀïµÄwhere×Ӿ䣬Äã¿ÉÒÔ³¢ÊÔ²»Ð´where×Ó¾äÀ´Ö´ÐÐÒÔÏÂÕâ¾ä»°£¬Ä㽫»áʹµÃempÖеĺܶàÖµ±ä³É¿Õ¡£

ÕâÊÇÒòΪÔÚoracleµÄupdateÓï¾äÖÐÈç¹û²»Ð´where×Ó¾ä,oracle½«»áĬÈϵİÑËùÓеÄֵȫ²¿¸üУ¬¼´Ê¹ÄãÕâÀïʹÓÃÁË×Ó²éѯ²¢ÇÒijÔÚÖµ²¢²»ÄÜÔÚ×Ó²éѯÀïÕÒµ½£¬Äã¾Í»áÏ뵱ȻµÄÒÔΪ,oracle»òÐí½«»áÌø¹ýÕâЩֵ°É£¬Äã´íÁË£¬oracle½«»á°Ñ¸ÃÐеÄÖµ¸üÐÂΪ¿Õ¡£

ÎÒÃÇ»¹»¹¿ÉÒÔÕâôд£º

update (select a.sal asal,b.sal bsal,a.comm acomm,b.comm bcomm from emp a,emp1 b where a.empno = b.empno)
set asal = bsal,
acomm = bcomm;

ÕâÀïµÄ±íÊÇÒ»¸öÀàÊÓͼ¡£
µ±È»ÄãÖ´ÐÐʱ¿ÉÄÜ»áÓöµ½ÈçÏ´íÎó:

ERROR λÓÚµÚ 2 ÐÐ:
ORA-01779: ÎÞ·¨ÐÞ¸ÄÓë·Ç¼üÖµ±£´æ±í¶ÔÓ¦µÄÁÐ
ÕâÊÇÒòΪн¨µÄ±íemp1»¹Ã»ÓÐÖ÷¼üµÄÔµ¹Ê

ÏÂÃæÔö¼ÓÒ»¸öÖ÷¼ü
alter table emp1
add constraint pk_emp1 primary key (empno);

Ö´ÐÐÖ®ºó

ÔÚÖ´ÐÐÇ°ÃæµÄÓï¾ä¾ÍÄܳɹ¦¡£

ÕâÀïÎÒÃÇ×ܽáһϣº

ÔÚoracleÖв»´æÔÚupdate from½á¹¹£¬ËùÒÔÓöµ½ÐèÒª´ÓÁíÍâÒ»¸ö±íÀ´¸üб¾±íµÄÖµµÄÎÊÌâµÄʱºò£¬ÓÐÁ½ÖÖ½â¾öµÄ°ì·¨:

Ò»ÖÖÊÇʹÓÃ×Ó²éѯ£¬Ê¹ÓÃ×Ó²éѯʱһ¶¨Òª×¢ÒâwhereÌõ¼þ(Ò»°ãºóÃæ½Óexists×Ó¾ä)£¬³ý·ÇÁ½¸ö±íÊÇÒ»Ò»¶ÔÓ¦µÄ£¬·ñÔòwhereÌõ¼þ±Ø²»¿ÉÉÙ£¬ÒÅ©µôwhereÌõ¼þʱ¿ÉÄܻᵼÖ²åÈë´óÁ¿¿ÕÖµ¡£

ÁíÍâÒ»ÖÖÊÇÀàÊÓͼµÄ¸üз½·¨£¬ÕâÒ²ÊÇoracleËù¶ÀÓеġ£ÏȰѶÔÓ¦µÄÊý¾ÝÈ«²¿³éÈ¡³öÀ´£¬È»ºó¸üбíÒ»Ñù¸üÐÂÊý¾Ý£¬ÕâÀïÐèҪעÒâµÄÊÇ£¬±ØÐë±£Ö¤±íµÄÊý¾ÝΨһÐÍ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ