在单个SQL查询中交换同一表的列值

时间:2017-08-28 20:32:19

标签: sql sql-server sql-server-2008

我需要使用不同的密钥更新两行的列值。约束是我想在单个查询中执行此操作。

例如:

Coll1   Coll2
---------------
  A       1
  B       2
  C       3

应该像

Coll1   Coll2
--------------
  A       3
  B       2
  C       1

5 个答案:

答案 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)