我把zhou的转出来了,大家看着更直观。
今天给一个同事调试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条数据的,没有对于ID的则被更新为空
*/
SELECT * FROM TEST1;
|