基于分组的SQL Update:统一同一Journal下Segment的大小写格式
问题描述
系统会为每个Journal #生成两条记录:第1条由系统自动生成,第2条为用户前端录入。目前存在同一Journal #下两条记录的Segment大小写不一致的问题——第1条采用后端存储格式,第2条保留用户录入的大小写,影响后续业务流程。
当前表数据:
| HMY | Journal # | Segment |
|---|---|---|
| 1 | 10001 | House |
| 2 | 10001 | HouSE |
| 3 | 10002 | FLAT |
| 4 | 10002 | flat |
| 5 | 10003 | Unit |
| 6 | 10003 | UniT |
期望更新后,每个Journal #的第2条记录Segment与第1条完全一致:
| HMY | Journal # | Segment |
|---|---|---|
| 1 | 10001 | House |
| 2 | 10001 | House |
| 3 | 10002 | FLAT |
| 4 | 10002 | FLAT |
| 5 | 10003 | Unit |
| 6 | 10003 | Unit |
尝试过按Journal #分组取min(HMY)更新max(HMY)的Segment,以及基于前一行更新的方法,均未成功,需正确的SQL Update实现方案。
解决方案
核心思路:找到每个Journal #下HMY最小的记录(系统自动生成的第1条)的Segment值,将同Journal #下HMY最大的记录(用户录入的第2条)的Segment更新为该值。以下是不同数据库的实现代码:
MySQL
UPDATE your_table t1 JOIN ( SELECT `Journal #`, MIN(HMY) AS min_hmy, MAX(HMY) AS max_hmy FROM your_table GROUP BY `Journal #` ) t2 ON t1.`Journal #` = t2.`Journal #` JOIN your_table t3 ON t3.`Journal #` = t2.`Journal #` AND t3.HMY = t2.min_hmy SET t1.Segment = t3.Segment WHERE t1.HMY = t2.max_hmy;
SQL Server
UPDATE t1 SET t1.Segment = t3.Segment FROM your_table t1 INNER JOIN ( SELECT [Journal #], MIN(HMY) AS min_hmy, MAX(HMY) AS max_hmy FROM your_table GROUP BY [Journal #] ) t2 ON t1.[Journal #] = t2.[Journal #] INNER JOIN your_table t3 ON t3.[Journal #] = t2.[Journal #] AND t3.HMY = t2.min_hmy WHERE t1.HMY = t2.max_hmy;
Oracle
MERGE INTO your_table t1 USING ( SELECT t."Journal #", t.Segment, (SELECT MAX(HMY) FROM your_table WHERE "Journal #" = t."Journal #") AS max_hmy FROM your_table t WHERE t.HMY = (SELECT MIN(HMY) FROM your_table WHERE "Journal #" = t."Journal #") ) t2 ON (t1.HMY = t2.max_hmy AND t1."Journal #" = t2."Journal #") WHEN MATCHED THEN UPDATE SET t1.Segment = t2.Segment;
注意事项
- 将代码中的
your_table替换为实际的表名 - 针对
Journal #这类含特殊字符的字段,不同数据库的转义方式不同:MySQL用反引号`,SQL Server用方括号[],Oracle用双引号""
内容的提问来源于stack exchange,提问作者Shaine321
相关产品推荐
相关产品推荐

