CREATE TABLE TC (CODE CHAR(8) NOT NULL,
AGE NUMBER,
STATE CHAR(4) DEFAULT 'a' );
TABLE QE (CODE,GRADE,STATE)TD 和QE中的CODE都是没有重复的,TC中的STATE均为 'a',当执行下面的更新语句时,没有被更新到的TC中的列,不再是'a'了,都变成了空值,这是怎么回事啊update TC SET(STATE)=(SELECT B.STATE FROM QE B WHERE TC.CODE=QE.CODE);
AGE NUMBER,
STATE CHAR(4) DEFAULT 'a' );
TABLE QE (CODE,GRADE,STATE)TD 和QE中的CODE都是没有重复的,TC中的STATE均为 'a',当执行下面的更新语句时,没有被更新到的TC中的列,不再是'a'了,都变成了空值,这是怎么回事啊update TC SET(STATE)=(SELECT B.STATE FROM QE B WHERE TC.CODE=QE.CODE);
where exists(select 1 FROM QE c WHERE TC.CODE=c.CODE)
default意思是,只有当你不插入值的时候,才是'a'
比如
insert table TC values('a',10);---state的值为'a'insert table TC values('a',10,'');-----state的值为空
Integrity constraint checking occurs after the row with a default value is inserted.
也就是说default只对insert有效.
这样可以达到你的目的
这个肯定会把不匹配的全部更新为null update TC SET(STATE)=(SELECT B.STATE FROM QE B WHERE TC.CODE=QE.CODE);
当TC.CODE=QE.CODE不匹配的时候 更新就成了这样update TC SET(STATE)=null所以的加个where
update TC SET(STATE)=(SELECT B.STATE FROM QE B WHERE TC.CODE=QE.CODE);
where exists(SELECT 1 FROM QE c WHERE TC.CODE=c.CODE)