SQL Server:如何交换同一Customer_Id行的Rate与Pid值
如何在SQL Server的Sales表中交换同Customer_Id行的Rate和Pid值?
嘿,针对你这个需求,我们可以用自连接的UPDATE语句轻松搞定——毕竟要交换同一客户下两行的字段值,核心就是把这两行关联起来,互相赋值就行。
先看你的数据特点:每个需要处理的Customer_Id都有两行,一行Rate是1且带Pid,另一行Rate是0(Pid可能是NULL或者其他值)。我们就基于这个特征来写SQL:
最终可用的更新语句
UPDATE t1 SET t1.Rate = t2.Rate, t1.Pid = t2.Pid FROM Sales t1 INNER JOIN Sales t2 ON t1.Customer_Id = t2.Customer_Id AND t1.Rate != t2.Rate -- 确保匹配的是同一客户下不同Rate的两行 WHERE (t1.Rate = 1 AND t2.Rate = 0) OR (t1.Rate = 0 AND t2.Rate = 1);
为啥这么写?我给你拆解下:
- 自连接关联:通过
Customer_Id把同一客户的两行绑在一起,再加t1.Rate != t2.Rate的条件,避免同一条记录自己跟自己连接(那样更新就没意义了)。 - 双向赋值:WHERE子句覆盖了两种情况——Rate=1的行和Rate=0的行互相匹配,所以一次UPDATE就能完成两行的字段交换,不用分两次写。
- 兼容特殊情况:像你数据里
Customer_Id=1234只有一行的情况,这条语句根本碰不到它,因为找不到对应的关联行,完全符合预期。
执行后你会得到的目标结果:
| Id | Customer_Id | Rate | Pid |
|---|---|---|---|
| 180 | 374 | 0 | NULL |
| 277 | 374 | 1 | A01 |
| 346 | 785 | 0 | NULL |
| 476 | 785 | 1 | D03 |
| 1821 | 1234 | 0 | E07 |
| 25951 | 1951 | 1 | K73 |
完美实现了你要的交换效果~
内容的提问来源于stack exchange,提问作者meiji
相关产品推荐
相关产品推荐

