如何UPDATE两张完全相同的表行 使其中一行部分字段值不同
核心解决思路
因为你插入的两行所有业务字段值完全一致,没有可用于区分的唯一业务主键,因此需要借助数据库内置的行唯一标识来定位其中一行做差异化更新,你示例用的是Oracle语法的建表语句,因此可以直接用Oracle内置的ROWID字段实现,这是每一行数据天生唯一的标识,不会重复。
具体SQL语句
第一步:统一更新两行的名称和描述字段
先把所有符合条件的行的ACCT_GRP_NM和ACCT_GRP_DESC统一修改为目标值HEB:
UPDATE T1 SET ACCT_GRP_NM = 'HEB', ACCT_GRP_DESC = 'HEB' WHERE ACCT_GRP_CD = 829 AND MAT_CO_CD = 'MUSA' AND ACCT_GRP_NM = 'Z HEB';
第二步:差异化更新其中一行的公司编码
我们只取两行中的任意一行,修改其MAT_CO_CD为FPUS,这里通过子查询取匹配行的第一个ROWID实现:
UPDATE T1 SET MAT_CO_CD = 'FPUS' WHERE ROWID = ( SELECT RID FROM ( SELECT ROWID RID, ROWNUM RN FROM T1 WHERE ACCT_GRP_CD = 829 AND MAT_CO_CD = 'MUSA' ) T WHERE T.RN = 1 );
结果验证
执行完成后查询表数据即可得到你预期的结果:
SELECT * FROM T1;
返回结果:
| ACCT_GRP_CD | MAT_CO_CD | ACCT_GRP_NM | ACCT_GRP_DESC |
|---|---|---|---|
| 829 | MUSA | HEB | HEB |
| 829 | FPUS | HEB | HEB |
原语句问题说明
你之前编写的UPDATE语句存在两个核心问题:
- 语法错误:第一个UPDATE语句重复写了
SET关键字,字段赋值语句之间不需要加AND连接 - 逻辑错误:第二个UPDATE语句的筛选条件会匹配到所有符合条件的行,无法区分两行完全重复的记录,会导致两行被同步修改,无法得到差异化结果
内容的提问来源于stack exchange,提问作者srikanth b
相关产品推荐
相关产品推荐

