update select的select有不存在的字段也能成功

SignLCF 2012-04-25 07:06:50
CREATE TABLE TEMP1(
EmpNo NUMBER(6) PRIMARY KEY,
Deptno NUMBER(6),
Remark VARCHAR2(100)
);
insert into TEMP1 values(1,111,'备注111');
insert into TEMP1 values(2,222,'备注222');
insert into TEMP1 values(3,333,'备注333');

CREATE TABLE TEMP2(
Deptno NUMBER(6),
loc VARCHAR2(10)
);
insert into TEMP2 values(111,'NEWYORK');
insert into TEMP2 values(222,'BEIJING');
insert into TEMP2 values(333,'SHANGHAI');
insert into TEMP2 values(444,'SHENGZHENG');

下面的update查询temp2中字段更新temp1,但temp2中没有empno,remark字段也能执行成功,
deptno值更改了,但empno和remark的值没变;
并且如果select中的不存在的两个字段也不存在temp1中的话执行就会报错。
update TEMP1
set (deptno,empno,remark)=(select deptno,empno,remark from TEMP2 where deptno=222)
where empno=1;
哪位前辈能帮忙分析下这个update是怎么解析执行的...
...全文
243 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenr21c 2012-04-26
  • 打赏
  • 举报
回复
实际上这个语句等同于

update TEMP1
set deptno=(select deptno from TEMP2 where deptno=222),
empno=empno,
remark=remark
where empno=1;

也就是empno是TEMP1自己表的字段,把这个值查出来不做修改再update回去。。
SignLCF 2012-04-26
  • 打赏
  • 举报
回复
update TEMP1
set (deptno,empno,remark)=(select deptno,empno,remark from TEMP2 where deptno=222)
where empno=1;
这样可以执行成功的,不过是只更新了的deptno;而empno,remark没有变.
第一次碰到这样的SQL,我就算想知道这个update是怎么解析执行的...
zjz8204 2012-04-26
  • 打赏
  • 举报
回复
是啊,用别名,表字段前加前缀。
SignLCF 2012-04-26
  • 打赏
  • 举报
回复
结果是什么情况我知道,也能猜出来他是怎么运行的,就是想问下为什么,那位高手能解答下或提供个参考资料,找了好久了没有结果
jdsnhan 2012-04-25
  • 打赏
  • 举报
回复
这样写是关联子查询。

如果想更新,可以才用楼上的方法:

update TEMP1
set (deptno,empno,remark)=(select TEMP2.deptno,empno,remark from TEMP2 where deptno=222)
where empno=1;
lxyzxq2008 2012-04-25
  • 打赏
  • 举报
回复
update TEMP1
set (deptno,empno,remark)=(select deptno,empno,remark from TEMP2 where deptno=222)
where empno=1;
把你上面sql中的字段都加上表的别名,你再运行下

17,078

社区成员

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

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