关联update问题(转自zhouwf0726)

今天给一个同事调试SQL,做个记录。

CREATE TABLE TEST1(ID VARCHAR2(20) NOT NULL PRIMARY KEY,
MC VARCHAR2(60));

CREATE TABLE TEST2(ID VARCHAR2(20) NOT NULL PRIMARY KEY,
MC VARCHAR2(60));

INSERT INTO TEST1 VALUES('1','1-11111');
INSERT INTO TEST1 VALUES('2','1-22222');
INSERT INTO TEST1 VALUES('3','1-33333');

INSERT INTO TEST2 VALUES('1','2-11111');
INSERT INTO TEST2 VALUES('2','2-22222');

UPDATE (SELECT A.MC MCA,B.MC MCB FROM TEST1 A,TEST2 B WHERE A.ID=B.ID) SET MCA=MCB;

/*
2 rows updated

这个写法要求TEST2表要有主建,否则SQL无法执行!

ORA-01779: 无法修改与非键值保存表对应的列
*/

SELECT * FROM TEST1;

/*

ID MC
-------------------- -------------------
1 2-11111
2 2-22222
3 1-33333

*/

ROLLBACK;

UPDATE TEST1 A SET MC = (SELECT MC FROM TEST2 B WHERE A.ID=B.ID) WHERE EXISTS (SELECT ID FROM TEST2 B WHERE A.ID=B.ID);

/*
2 rows updated
如果不加后边的where则是update 3条数据的
*/

SELECT * FROM TEST1;

zhouwf0726 发表于:2006.09.07 17:48
[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/795108/viewspace-925151/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/795108/viewspace-925151/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值