基于JOIN的行级更新:SQL Server与MySQL实现方案问询
SQL Server与MySQL实现:同步bankaccount与同document_id下的iban值
需求说明
将example_table中meta_key为bankaccount的行的meta_value,更新为同一document_id下meta_key为iban的行对应的meta_value。
更新前数据
| document_id | meta_key | meta_value |
|---|---|---|
| 1 | iban | IBAN123456 |
| 1 | bankaccount | ACCT987654 |
| 2 | iban | IBAN555555 |
| 2 | bankaccount | ACCT444444 |
| 3 | iban | IBAN888888 |
| 3 | bankaccount | ACCT333333 |
更新后预期数据
| document_id | meta_key | meta_value |
|---|---|---|
| 1 | iban | IBAN123456 |
| 1 | bankaccount | IBAN123456 |
| 2 | iban | IBAN555555 |
| 2 | bankaccount | IBAN555555 |
| 3 | iban | IBAN888888 |
| 3 | bankaccount | IBAN888888 |
SQL Server 实现方案
通过自连接关联同表数据,匹配document_id并筛选对应meta_key完成更新:
UPDATE ba SET ba.meta_value = ib.meta_value FROM example_table ba JOIN example_table ib ON ba.document_id = ib.document_id WHERE ba.meta_key = 'bankaccount' AND ib.meta_key = 'iban';
逻辑说明:
- 用
ba指代待更新的bankaccount行,ib指代对应文档的iban行 - 基于
document_id关联两行,确保更新的是同一文档下的对应值 - 仅对
meta_key为bankaccount的行执行更新操作
MySQL 实现方案
提供两种常用写法,适配不同场景:
写法一:JOIN式更新(性能更优,适合大数据量)
UPDATE example_table ba JOIN example_table ib ON ba.document_id = ib.document_id SET ba.meta_value = ib.meta_value WHERE ba.meta_key = 'bankaccount' AND ib.meta_key = 'iban';
写法二:子查询式更新(语法简洁,适合简单场景)
UPDATE example_table SET meta_value = ( SELECT meta_value FROM example_table ib WHERE ib.document_id = example_table.document_id AND ib.meta_key = 'iban' ) WHERE meta_key = 'bankaccount';
逻辑说明:
- JOIN写法通过表关联直接匹配数据,执行效率更高
- 子查询写法直接通过
document_id获取对应iban值,代码更直观
内容的提问来源于stack exchange,提问作者Ebrahim Amini Sharifi
相关产品推荐
相关产品推荐

