根据两张表中相同的id,用一张表中的字段列新另一张表

1)创建表tb1
SQL> create table tb1(id int,name varchar2(10));

表已创建。
SQL> insert into tb1(id) values(1);

已创建 1 行。

SQL> insert into tb1(id) values(2);

已创建 1 行。

SQL> insert into tb1(id) values(3);

已创建 1 行。

SQL> insert into tb1(id) values(10);

已创建 1 行。

SQL> commit;

提交完成。
2)创建表tb2
SQL> create table tb2(id int,name varchar2(10));

表已创建。

SQL> insert into tb2 values(1,'A');

已创建 1 行。

SQL> insert into tb2 values(2,'B');

已创建 1 行。

SQL> insert into tb2 values(3,'C');

已创建 1 行。

SQL> commit;

提交完成。
3)查看两张表数据
SQL> select * from tb1;

        ID NAME
---------- ----------
         1
         2
         3
        10

SQL> select * from tb2;

        ID NAME
---------- ----------
         1 A
         2 B
         3 C

SQL> update tb1 t set t.name=select b.name from tb2 b where t.id=b.id;   --错误写法
update tb1 t set t.name=select b.name from tb2 b where t.id=b.id
                        *
第 1 行出现错误:
ORA-00936: 缺失表达式

SQL> ed
已写入 file afiedt.buf

  1  update tb1 t set t.name=(select b.name from tb2 b where t.id=b.id)
  2* where exists(select *from tb2 b where t.id=b.id)
SQL> /

已更新3行。

4)更新后tb1表的内容:
SQL> select * from tb1;

        ID NAME
---------- ----------
         1 A
         2 B
         3 C
        10

SQL> select * from tb2;

        ID NAME
---------- ----------
         1 A
         2 B
         3 C

5)如果tb2表id不唯一,更新会是什么情况?
SQL> insert into tb2 values(1,'D');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from tb2;

        ID NAME
---------- ----------
         1 A
         2 B
         3 C
         1 D

SQL> update tb1 t set t.name=(select b.name from tb2 b where t.id=b.id)
  2  where exists(select *from tb2 b where t.id=b.id);
update tb1 t set t.name=(select b.name from tb2 b where t.id=b.id)
                         *
第 1 行出现错误:
ORA-01427: 单行子查询返回多个行

1. 对于子查询的值只能是一个唯一值,不能是多值。
2. 子查询在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。
    且where EXISTS子句可用另一方法代替,如上。最后的子句是对a表被更新记录的限制,如无此句,对于a表中某记录,如在b表中关联不到对应的记录,则该记录被更新字段将被更新为null。
    where EXISTS子句就是排除对a表中该情况的记录进行更新。

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

转载于:http://blog.itpub.net/26937943/viewspace-1192119/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值