update关联其他表问题

[复制链接]
查看11 | 回复8 | 2012-4-16 16:44:24 | 显示全部楼层 |阅读模式
本帖最后由 nouvelliu 于 2012-4-13 10:08 编辑
2张表,a表,b表,a表的某些字段数据是从b表的一些字段导入过来的,若b表某个字段更新,要用update对a表的数据进行更新。
create table a (
SP_CODE VARCHAR2(20),
OPERATOR_CODE VARCHAR2(20),
SERV_TYPE VARCHAR2(20),
COUNT NUMBER(6));

create table b(
SP_CODE VARCHAR2(20),
OPERATOR_CODE VARCHAR2(20),
SERV_TYPE VARCHAR2(20));

insert into b values(900553,02011904,104);
insert into b values(900553,02012078,104);
insert into b values(900553,03201669,104);
insert into b values(900553,31053431,104);

insert into a (SP_CODE ,OPERATOR_CODE,SERV_TYPE ,COUNT )
select b.SP_CODE ,b.OPERATOR_CODE,b.SERV_TYPE,null
fromb;

现在是,sp_code 和operator_code 保持不变的,b表的serv_type会更新。
例如:900553,31053431,103 中的104更新为103了但是在a表里还是104
通过sp_code 和operator_code在a表里,把对应的serv_type更新,这样的update语句怎么写?
UPDATE a SET a.SERV_TYPE =
(SELECTb.SERV_TYPE FROM b,a WHERE b.SP_CODE = a.SP_CODE AND b.OPERATOR_CODE = a.OPERATOR_CODE)
WHERE a.SP_CODE IN (SELECT b.SP_CODE FROM b,a WHERE b.SP_CODE = a.SP_CODE);
出现 ORA-01427: single-row subquery returns more than one row ,我知道是子句中返回多条数据的问题,但是不知道怎么解决。


回复

使用道具 举报

千问 | 2012-4-16 16:44:24 | 显示全部楼层
b表必须有一个主键, 这个主键是终生不变的,a表里面引用b这个主键。
这样才有可能从a表中找到需要修改的记录。

回复

使用道具 举报

千问 | 2012-4-16 16:44:24 | 显示全部楼层
newkid 发表于 2012-4-12 21:51
b表必须有一个主键, 这个主键是终生不变的,a表里面引用b这个主键。
这样才有可能从a表中找到需要修改的记 ...

若sp_code 和 operator_code 就可以表示唯一一条记录,a表用这2个字段 来找到修改记录 作用和主键一样吧
回复

使用道具 举报

千问 | 2012-4-16 16:44:24 | 显示全部楼层
既然你A表的sp_code都改成103了
B表里面的so_code还是104,而且B表serv_type也会更新,就剩下一个operator_code ,这个字段都是重复的,试问如何确定要修改的记录?
个人感觉表结构有缺陷
回复

使用道具 举报

千问 | 2012-4-16 16:44:24 | 显示全部楼层
SGPM_OUT 发表于 2012-4-13 09:44
既然你A表的sp_code都改成103了
B表里面的so_code还是104,而且B表serv_type也会更新,就剩下一个operator ...

哦错了,是sp_code和operator_code不变,b表的serv_type会更新。举例举错了。
回复

使用道具 举报

千问 | 2012-4-16 16:44:24 | 显示全部楼层
SGPM_OUT 发表于 2012-4-13 09:44
既然你A表的sp_code都改成103了
B表里面的so_code还是104,而且B表serv_type也会更新,就剩下一个operator ...

插入b表的数据 顺序 写错了,104列对应的是serv_type 不是对应sp_code,已经修改了
回复

使用道具 举报

千问 | 2012-4-16 16:44:24 | 显示全部楼层
本帖最后由 SGPM_OUT 于 2012-4-13 10:56 编辑
nouvelliu 发表于 2012-4-13 10:10
插入b表的数据 顺序 写错了,104列对应的是serv_type 不是对应sp_code,已经修改了
貌似这样能行
UPDATE a SET a.SERV_TYPE =
(SELECTb.SERV_TYPE FROM b WHERE b.SP_CODE = a.SP_CODE AND b.OPERATOR_CODE = a.OPERATOR_CODE and b.serv_typea.serv_type)
where a.operator_code in
(select b.operator_code from b WHERE b.SP_CODE = a.SP_CODE AND b.OPERATOR_CODE = a.OPERATOR_CODE and b.serv_typea.serv_type)
回复

使用道具 举报

千问 | 2012-4-16 16:44:24 | 显示全部楼层
SGPM_OUT 发表于 2012-4-13 10:56
貌似这样能行
UPDATE a SET a.SERV_TYPE =

若b表中只有一行数据修改了,能行。
若是b表有2条或者多条数据,例:
900553,03201669,104---104 修改为102
900553,31053431,104---104 修改为103
这样有2条数据更新了,执行你的脚本,还是出现ORA-01427: single-row subquery returns more than one row
回复

使用道具 举报

千问 | 2012-4-16 16:44:24 | 显示全部楼层
本帖最后由 SGPM_OUT 于 2012-4-13 16:16 编辑
nouvelliu 发表于 2012-4-13 16:06
若b表中只有一行数据修改了,能行。
若是b表有2条或者多条数据,例:
900553,03201669,104---104 修改 ...

针对你这个有多条修改的 上面那条语句我就考虑进去了
下面是我本地的数据:
a
900553 2011904
104 NULL
900553 2012078
104 NULL
900553 3201669
104 NULL
900553 31053431
104
NULL
900553 31053433
103 NULL
b
900553 2011904
104
900553 2012078
104
900553 3201669
104
900553 31053431
102
900553 31053433
102


111.jpg (56.78 KB, 下载次数: 12)
下载附件
2012-4-13 16:15 上传
没有报一行返回多行啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行