SQL实现:基于Email/BId多优先级匹配更新表列
SQL更新优先级需求解决方案
需求说明
更新table1的PrespI列,优先级规则如下:
- 优先使用table2中满足以下条件的
RespI:与table1记录通过UniqueId关联的table2中EL='E'的记录,其EmailId与table2中EL='L'的记录的EmailId匹配; - 若不存在上述匹配,则使用table2中与该
EL='E'记录同BId且EL='L'的任意RespI值; - 若均无匹配则保持
PrespI为NULL。
表结构与数据
table1
| EL | UniqueId | RespDt | RespI | PrespI |
|---|---|---|---|---|
| E | cd4fbc4a-a303-42b6-858a-5639525a20e3 | 2024-03-13 | 1234567 | NULL |
| E | dd94ae32-2e22-4969-8e37-6f7711050df7 | 2024-03-13 | 6598456 | NULL |
| E | 570e1a04-b5b8-4a8e-bbc8-588c3157b9a4 | 2024-03-13 | 3594685 | NULL |
table2
| BId | UniqueId | EmailId | RespDt | EL | RespI |
|---|---|---|---|---|---|
| 123 | cd4fbc4a-a303-42b6-858a-5639525a20e3 | abc@test.com | 2024-03-13 | E | 1234567 |
| 123 | cd4fbc4a-a303-42b6-858a-5639525a20e3 | abc@test.com | 2023-03-13 | L | 8945632 |
| 123 | 3206a0a4-9859-4a97-92a0-602b527896df | dgh@test.com | 2023-03-13 | L | 7798653 |
| 541 | 570e1a04-b5b8-4a8e-bbc8-588c3157b9a4 | clr@test.com | 2024-03-13 | E | 3594685 |
| 541 | 88960021-c6b7-48bf-8421-20fa63296b7d | def@test.com | 2023-03-13 | L | 4681256 |
| 541 | 0b0fb857-6eb7-4f67-8672-813331b5224e | hkr@test.com | 2023-03-13 | L | 0235489 |
| 876 | dd94ae32-2e22-4969-8e37-6f7711050df7 | plc@test.com | 2024-03-13 | E | 6598456 |
预期更新结果
| EL | UniqueId | RespDt | RespI | PrespI |
|---|---|---|---|---|
| E | cd4fbc4a-a303-42b6-858a-5639525a20e3 | 2024-03-13 | 1234567 | 8945632 |
| E | dd94ae32-2e22-4969-8e37-6f7711050df7 | 2024-03-13 | 6598456 | NULL |
| E | 570e1a04-b5b8-4a8e-bbc8-588c3157b9a4 | 2024-03-13 | 3594685 | 4681256 |
当前尝试的SQL
仅能更新EmailId匹配的记录,无法处理优先级降级的情况:
UPDATE t1 SET t1.PrespI = t3.RespI FROM dbo.table1 AS t1 INNER JOIN dbo.table2 AS t2 on t1.UniqueId = t2.UniqueId and t2.EL = 'E' INNER JOIN dbo.table2 AS t3 on t2.BId = t3.BId and t3.EL = 'L' WHERE t2.EmailId = t3.EmailId;
正确的SQL实现方案
使用窗口函数ROW_NUMBER()为匹配项排序,确保优先级规则生效:
WITH RankedMatches AS ( SELECT t1.UniqueId, t3.RespI, ROW_NUMBER() OVER ( PARTITION BY t1.UniqueId ORDER BY CASE WHEN t2.EmailId = t3.EmailId THEN 1 ELSE 2 END, -- 优先匹配EmailId t3.RespI -- 同BId时指定排序字段,确保取固定值,可根据需求调整 ) AS rn FROM dbo.table1 AS t1 INNER JOIN dbo.table2 AS t2 ON t1.UniqueId = t2.UniqueId AND t2.EL = 'E' LEFT JOIN dbo.table2 AS t3 ON t2.BId = t3.BId AND t3.EL = 'L' ) UPDATE t1 SET PrespI = rm.RespI FROM dbo.table1 AS t1 LEFT JOIN RankedMatches AS rm ON t1.UniqueId = rm.UniqueId AND rm.rn = 1;
逻辑说明
- CTE
RankedMatches:关联table1与table2的EL='E'记录,再左连接table2中同BId的EL='L'记录; - 排序规则:用
ROW_NUMBER()按UniqueId分区,EmailId匹配的记录排第1,其他同BId的L记录排第2; - 更新操作:仅取每个分区中排名第1的记录更新table1的
PrespI,若无匹配项则保持NULL。
内容的提问来源于stack exchange,提问作者Navneeth
相关产品推荐
相关产品推荐

