oracle 两个表中的身份证最后一位a表是大写X,b表是小写x,怎么把b表中的身份证update到a表

两个表 只有身份证和名字是相同字段,但是名字很多重名,不能用名字。a的身份证号很多是错的,我的任务就是从b表去修改a表的身份证。如何做,求大神!
update m_difficultyperson set idcard =(select 身份证 from personidtest p,m_difficultyperson m where
substr(身份证,0,length(身份证)-1)=substr(idcard,0,length(idcard)-1) and 身份证 like'%x' and idcard like'%X');
我这样写就是找出了两个表的对应关系,但是单行子查询返回多行。但是我要把这些正确的身份证 = 到 m的idcard 里去。
最新回答
香草天空

2025-02-25 01:36:22

用upper()不行吗

update a set a.cardid=(select b.cardid from b where upper(b.cardid)=upper(a.cardid))
where exists (select b.cardid from b where b.cardid<>a.cardId and upper(b.cardid)=upper(a.cardid)).
意思就是说:
1、a表中的身份证号和b表中的身份证号不一样
2、a表中的身份证号和b表中的身份证号大小写转化后就一样
例如:b表中有一个4301111111x,a表中有一个4301111111X
不加upper之前不相等,加upper后相等
你模仿不起

2025-02-25 00:07:03

那通过什么条件来判断a表中的身份证应该改成什么值,如果只是变成大写的话
a.身份证=upper(a.身份证) 就行了
追问
我没说清楚貌似,不能直接改成大写,因为a表中有很多身份证的小写x是正确的,那些不能动。
详细点说就是比如b表中有一个4301111111x,a表中有一个4301111111X,这样就要把a表的X改成x。就是必须b表里面有的才去修改a表前面数字相同但是x的大小写不同的数据。
应该是用update做,但是我不会写条件。是不是要用到循环?
追答
那就是说满足以下情况就可以update
1 a表的身份证号最后一位为大写
2 a表的身份证最后一位变小写以后在b表中存在
update a set a.身份证=lower(a.身份证)
where exists (select 1 from b where b.身份证=lower(a.身份证)) --证明b表中有此数据
and a.身份证lower(a.身份证) --证明X为大写
夏日梧桐雨

2025-02-25 03:35:58

update a set a.身份=b.身份 from table1 a,table2 b where a.身份=substr(b.身份,0,17)+'X' and a.name=b.name and a.身份!=b.身份
风铃鹿

2025-02-25 01:06:01

update a set a.sfzh=(
select b.sfzh
from a , b
where upper(a.sfzh)=upper(b.sfzh) and a.sfzh<>b.sfzh )
where exists (
select 1 from b where upper(a.sfzh)=upper(b.sfzh) and a.sfzh<>b.sfzh ) ;
啭裑①群豞

2025-02-25 00:25:42

update b表 set 身份证= (select a表.身份证 from a where 条件) where 条件
由于不知道a,b表有什么唯一对应关系 你自己应该知道这个思路了吧
追问
update m_difficultyperson  set idcard =(select 身份证 from personidtest p,m_difficultyperson m where substr(身份证,0,length(身份证)-1)=substr(idcard,0,length(idcard)-1) and 身份证 like'%x' and idcard like'%X');