我需要使用不同的密钥更新两行的列值。约束是我想在单个查询中执行此操作。
例如:
Coll1 Coll2
---------------
A 1
B 2
C 3
应该像
Coll1 Coll2
--------------
A 3
B 2
C 1
答案 0 :(得分:6)
使用case
表达式:
update t
set Coll2 = case when Coll1 = 'A' then 3 else 1 end
where Coll1 in ('A','C')
rextester演示:http://rextester.com/HUBDAP9516
返回:
+-------+-------+
| Coll1 | Coll2 |
+-------+-------+
| A | 3 |
| B | 2 |
| C | 1 |
+-------+-------+
更新参数化版本:
declare @key1 char(1) = 'A';
declare @key2 char(1) = 'C';
update t
set t.Coll2 = x.Coll2
from t
inner join t x
on t.Coll1 <> x.Coll1
and t.Coll1 in (@key1,@key2)
and x.Coll1 in (@key1,@key2)
rextester演示:http://rextester.com/PKQSAV63963
返回:
+-------+-------+
| Coll1 | Coll2 |
+-------+-------+
| A | 3 |
| B | 2 |
| C | 1 |
+-------+-------+
答案 1 :(得分:3)
也许您的意思是单笔交易。无论哪种方式,我都不明白为什么 - 但既然这就是你想要的,这是一个简单的方法。
declare @table table (Col1 char(1), Col2 int)
insert into @table
values
('A',1),
('B',2),
('C',3)
update @table
set
Col2 = case
when Col1 = 'A' then 3
when Col1 = 'C' then 1
end
where Col1 in ('A','C')
select * from @table
答案 2 :(得分:1)
UNION
答案 3 :(得分:0)
我想在没有硬编码col2的情况下尝试以下答案
create table #t (col1 char(301), col2 int);
go
insert into #t (col1, col2)
values ('A', 1), ('B', 2), ('C', 3)
; with c as (
select col1, col2
from #t
)
update t
set t.col2 = c.col2
from #t t
inner join c
on abs(ascii(t.col1) - ascii(c.col1))=2
select * from #t
答案 4 :(得分:0)
这是一个通用的解决方案,您可以将值切换为参数或子查询。
它也可以处理con char数据,但需要对字符串操作进行一些调整。
declare @table table (Col1 char(1), Col2 int)
insert into @table
values
('A',1),
('B',2),
('C',3)
declare @swap1 char='A'
declare @swap2 char='C'
update @table
set col2 = (select sum(col2) from @table
where col1 in (@swap1,@swap2))-col2
where col1 in (@swap1,@swap2)