Oracle SQL实现同表内父子记录关联更新银行账户字段
同表自关联更新子公司银行账户方案
你之前编写的SQL报无效错误、逻辑不对的核心原因有三点:
- 子查询未闭合、缺少必填的子查询别名,语法结构不完整
- 字段名拼写错误:
parent_company_ID误写为parent_compapny_id - 关联逻辑写反:原写法
ci.company_id = parentco颠倒了子公司与父公司的匹配规则,正确匹配规则应为子公司的parent_company_ID字段等于父公司的company_ID字段
可直接执行的更新语句
MySQL / SQL Server / PostgreSQL 通用写法
UPDATE child SET child.bank_acct = parent.bank_acct FROM Company_Info child INNER JOIN Company_Info parent ON child.parent_company_ID = parent.company_ID WHERE child.bank_acct IS NULL AND parent.bank_acct IS NOT NULL;
Oracle 环境适用写法
UPDATE Company_Info child SET child.bank_acct = ( SELECT parent.bank_acct FROM Company_Info parent WHERE parent.company_ID = child.parent_company_ID AND parent.bank_acct IS NOT NULL ) WHERE EXISTS ( SELECT 1 FROM Company_Info parent WHERE parent.company_ID = child.parent_company_ID AND child.bank_acct IS NULL );
更新前校验逻辑
正式执行更新前,先运行以下查询校验待更新的数据匹配关系是否符合预期,避免误更新:
SELECT child.company_ID AS 子公司ID, child.parent_company_ID AS 关联父公司ID, parent.bank_acct AS 待填充父公司银行账户, child.bank_acct AS 子公司当前账户值 FROM Company_Info child INNER JOIN Company_Info parent ON child.parent_company_ID = parent.company_ID WHERE child.bank_acct IS NULL AND parent.bank_acct IS NOT NULL;
如果查询返回的子公司、父公司对应关系和你预期完全一致,再执行更新语句即可。
执行后预期结果
更新完成后查询全表,即可得到目标数据:
company_ID, parent_company_ID, bank_acct ABC DEF 555444333 DEF <null> 555444333 GHI <null> 123456789 MNO GHI 123456789 PQR DEF 555444333
该写法对数千万级以内的数据量都可以正常执行,你的数千条记录场景下性能无压力。
内容的提问来源于stack exchange,提问作者stanltod
相关产品推荐
相关产品推荐

