yk156511 发表于 2022-12-21 10:15

oracle数据库,update更新的一个问题


假设A表有slid列 bdcdyh列。 本来是根据A表的slid和bdcdyh列相等进行维护。 语句如下
update bdc_qlrlb a set dyid =
(select djkid from bdc_regn_zb b where a.slid=b.slid and a.bdcdyh=b.bdcdyh and b.djkid is not null)
where exists (select 1 from bdc_regn_zb b where a.slid=b.slid and a.bdcdyh=b.bdcdyh and b.djkid is not null) and dyid is null and bz=0。
但是现在A表其余字段为空,只有一个slid列有值。只根据slid就会多对一,返回多个行错误,(如图).

这种情况下怎么维护。有没有大佬给个语句。

ygh0309 发表于 2022-12-21 10:45

https://blog.csdn.net/weixin_44657888/article/details/124591434   

merge into 可以处理你这个问题

ly765893958 发表于 2022-12-21 11:50

本帖最后由 ly765893958 于 2022-12-21 13:44 编辑

子查询里where条件没有将数据过滤成单条,如果确定存在这种情况的话,可以考虑where条件里加一个and rownum = 1,或者在子查询的select后面加一个distinct,就可以解决这个问题了!{:301_1007:}

ly765893958 发表于 2022-12-21 11:51

ygh0309 发表于 2022-12-21 10:45
https://blog.csdn.net/weixin_44657888/article/details/124591434   

merge into 可以处理你这个问题

别带偏了 楼主这很明显是子查询的where条件写的有问题很常见的一个报错了 {:301_1004:}

pojie2001 发表于 2022-12-21 11:53

selectmax(djkid) from bdc_regn_zb
第二行的djkid加聚合函数max或min 或者 dintinct 去重

你逻辑没错误的话以上三种结果相同

溯雪 发表于 2022-12-21 11:54

distinct

ygh0309 发表于 2022-12-21 13:24

ly765893958 发表于 2022-12-21 11:51
别带偏了 楼主这很明显是子查询的where条件写的有问题很常见的一个报错了

尬住,还得老哥你

ly765893958 发表于 2022-12-21 13:44

ygh0309 发表于 2022-12-21 13:24
尬住,还得老哥你

我也是用的多了{:301_1004:}

石淞元 发表于 2022-12-21 17:21

添加一个where条件将一对多数据帅选出来单独处理,看看一对多你什么原因照成的;第二种方法就是添加limit 1取中一个就可以
页: [1]
查看完整版本: oracle数据库,update更新的一个问题