日期:2014-05-17  浏览次数:20816 次

关于一个表更新到另一个表中
update a set a.aaa=(select b.bbb from b where a.id=b.id) 
where exists(select 1 from b where b.id=a.id) 

看不很明白,谁能给解释一下关于下面的 where exists


------解决方案--------------------
SQL code

--下面的条件是限制用的,以防止没有关联上的数据被更新成空的

--select b.bbb from b where a.id=b.id 查询出的结果可能是null,就是没有关联的数据
--exists 就是防止这样的情况还去更新的
---你自己做几条数据试一下就明白了

------解决方案--------------------
自己造数据,执行两遍 看结果有什么区别就知道了。
------解决方案--------------------
探讨
SQL code


--下面的条件是限制用的,以防止没有关联上的数据被更新成空的

--select b.bbb from b where a.id=b.id 查询出的结果可能是null,就是没有关联的数据
--exists 就是防止这样的情况还去更新的
---你自己做几条数据试一下就明白了

------解决方案--------------------
探讨
引用:
SQL code


--下面的条件是限制用的,以防止没有关联上的数据被更新成空的

--select b.bbb from b where a.id=b.id 查询出的结果可能是null,就是没有关联的数据
--exists 就是防止这样的情况还去更新的
---你自己做几条数据试一下就明白了


而且这里写不写都可以的

------解决方案--------------------
SQL> CREATE TABLE TEST1(ID VARCHAR2(20) NOT NULL PRIMARY KEY,
2 MC VARCHAR2(60));

表已创建。

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

表已创建。

SQL> INSERT INTO TEST1 VALUES('1','1-11111');

已创建 1 行。

SQL> INSERT INTO TEST1 VALUES('2','1-22222');

已创建 1 行。

SQL> INSERT INTO TEST1 VALUES('3','1-33333');

已创建 1 行。

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

已创建 1 行。

SQL> INSERT INTO TEST2 VALUES('2','2-22222');

已创建 1 行。

SQL> commit;

提交完成。

SQL> UPDATE TEST1 A SET MC = (SELECT MC FROM TEST2 B WHERE A.ID=B.ID) WHERE EXIS
TS (SELECT ID FROM TEST2 B WHERE A.ID=B.ID);

已更新2行。

SQL> rollback;

回退已完成。

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

已更新3行。

SQL> rollback;

回退已完成。

如果不写,他会把没有匹配到的更新为空
------解决方案--------------------
不要误人子弟。
请注意执行前后的,SELECT * FROM A;
SQL code

[TEST@myoracle] SQL>CREATE TABLE A(ID INT,aaa VARCHAR2(10));

表已创建。

[TEST@myoracle] SQL>CREATE TABLE B(ID INT,bbb VARCHAR2(10));

表已创建。

[TEST@myoracle] SQL>INSERT INTO A VALUES(1,'我是1');

已创建 1 行。

[TEST@myoracle] SQL>INSERT INTO A VALUES(2,'我是2');

已创建 1 行。

[TEST@myoracle] SQL>INSERT INTO A VALUES(3,'我是3');

已创建 1 行。

[TEST@myoracle] SQL>INSERT INTO B VALUES(1,'我不是1');

已创建 1 行。

[TEST@myoracle] SQL>SELECT * FROM A;

        ID AAA
---------- ----------
         1 我是1
         2 我是2
         3 我是3

[TEST@myoracle] SQL>SELECT * FROM B;

        ID BBB
---------- ----------
         1 我不是1

[TEST@myoracle] SQL>UPDATE A
  2     SET A.AAA =
  3         (SELECT B.BBB FROM B WHERE A.ID = B.ID)
  4   WHERE EXISTS (SELECT 1 FROM B WHERE B.ID = A.ID);

已更新 1 行。

[TEST@myoracle] SQL>SELECT * FROM A;

        ID AAA
---------- ----------
         1 我不是1
         2 我是2
         3 我是3

[TEST@myoracle] SQL>SELECT * FROM B;

        ID BBB
---------- ----------
         1 我不是1

[TEST@myoracle] SQL>DROP TABLE A;

表已删除。

[TEST@myoracle] SQL>DROP TABLE B;

表已删除。

[TEST@myoracle] SQL>CREATE TABLE A(ID INT,aaa VARCHAR2(10));

表已创建。

[TEST@myoracle] SQL>CREATE TABLE B(ID INT,bbb VARCHAR2(10));

表已创建。

[TEST@myoracle] SQL>INSERT INTO A VALUES(1,'我是1');

已创建 1 行。

[TEST@myoracle] SQL>INSERT INTO A VALUES(2,'我是2');

已创建 1 行。

[TEST@myoracle] SQL>INSERT INTO A VALUES(3,'我是3');

已创建 1 行。

[TEST@myoracle] SQL>INSERT INTO B VALUES(1,'我不是1');

已创建 1 行。

[TEST@myoracle] SQL>SELECT * F