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

本文通过实例演示了如何使用SQL语句更新两个关联表的数据,并介绍了在更新操作中常见的错误及解决方法。当目标表ID不唯一时,更新操作可能会导致错误结果。文章还详细解释了如何正确使用子查询和WHERE EXISTS子句来避免这些问题。

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/

SQL 中,将两张字段相同数据合并到一张中有多种方法,以下为几种常见的方式: ### 使用 UNION 操作符 `UNION` 操作符用于合并两个或多个 `SELECT` 语句的结果集,它会自动去除重复的记录。 ```sql SELECT column1, column2, ... FROM table1 UNION SELECT column1, column2, ... FROM table2; ``` 这里 `column1, column2, ...` 是中的名,`table1` 和 `table2` 是要合并的两张。例如,如果有两张 `employees1` 和 `employees2`,都有 `id`、`name` 和 `department` ,合并语句如下: ```sql SELECT id, name, department FROM employees1 UNION SELECT id, name, department FROM employees2; ``` ### 使用 UNION ALL 操作符 `UNION ALL` 操作符也用于合并两个或多个 `SELECT` 语句的结果集,但它不会去除重复的记录,因此执行速度相对 `UNION` 更快。 ```sql SELECT column1, column2, ... FROM table1 UNION ALL SELECT column1, column2, ... FROM table2; ``` 同样以 `employees1` 和 `employees2` 为例: ```sql SELECT id, name, department FROM employees1 UNION ALL SELECT id, name, department FROM employees2; ``` ### 插入到 可以先创建一个,然后将两张数据插入到中。 ```sql -- 创建 CREATE TABLE new_table AS SELECT column1, column2, ... FROM table1 UNION ALL SELECT column1, column2, ... FROM table2; ``` 以 `employees1` 和 `employees2` 为例: ```sql CREATE TABLE new_employees AS SELECT id, name, department FROM employees1 UNION ALL SELECT id, name, department FROM employees2; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值