SQL Server中如何用UPDATE语句更新Products表剩余行的owning_project值
解决方案:更新Products表的owning_project字段
先把你提供的表结构和数据用清晰的Markdown表格展示出来:
| product_id | product_rev | project | owning_project |
|---|---|---|---|
| 1 | aaa | p1 | p1 |
| 1 | baa | null | p1 |
| 1 | caa | null | p1 |
| 2 | ddd | p2 | p2 |
| 2 | eee | null | p2 |
| 2 | kkk | null | p2 |
| 3 | fff | p3 | p3 |
| 3 | ggg | p3 | p3 |
| 3 | hhh | null | p3 |
| 3 | iii | null | p3 |
| 4 | zzz | null | p4 |
| 4 | ttt | p4 | p4 |
| 4 | rrr | null | p4 |
从现有数据的规律来看,你的需求应该是:对同一个product_id下的所有记录,只要该product_id存在任意一条project字段非空的记录,就把该组所有记录的owning_project统一设置为这个非空的project值(毕竟每个product_id对应的非空project值是唯一的)。下面给你不同数据库的实现方案:
MySQL 实现语句
UPDATE Products p JOIN ( -- 先拿到每个product_id对应的非空project值 SELECT product_id, MAX(project) AS target_project FROM Products WHERE project IS NOT NULL GROUP BY product_id ) AS proj ON p.product_id = proj.product_id SET p.owning_project = proj.target_project;
PostgreSQL 实现语句
PostgreSQL用UPDATE ... FROM语法:
UPDATE Products p SET owning_project = proj.target_project FROM ( SELECT product_id, MAX(project) AS target_project FROM Products WHERE project IS NOT NULL GROUP BY product_id ) AS proj WHERE p.product_id = proj.product_id;
逻辑说明
- 子查询通过
GROUP BY product_id筛选出每个产品ID对应的非空project值(因为同一product_id下非空project唯一,用MAX或MIN都能准确拿到这个值); - 主查询通过product_id关联原表和子查询结果,批量更新所有对应记录的owning_project字段。
执行完后,所有product_id对应的记录owning_project都会和该组的非空project保持一致,和你给出的示例数据最终状态完全匹配。
内容的提问来源于stack exchange,提问作者badri
相关产品推荐
相关产品推荐

