使用值作为条件的UPDATE查询

时间:2017-07-19 11:57:40

标签: sql-server sql-update

我有一个更新查询,其格式为:

 update myTable
    set aColumn = case when t2.someValue = 3 then 1 else 0 end
  from myTable
  inner join anotherTable t2 on t2.id = myTable.id

麻烦的是,它不起作用。

'case'或t2.someValue似乎被忽略了,myTable中的每一行在aColumn中得到相同的值(0) - 包括那些t2.someValue = 3的行。

这是SQL Server的问题,还是我做错了什么?

编辑:我的更新查询,基于以下评论...

declare @myTable table  (row_id int, aCol int, bCol int)

insert into @myTable
values
(1,0,0),
(2,0,0),
(3,0,0),
(4,0,0),
(5,0,0)

declare @anotherTable table (row_id int, col_id int, someValue int)
insert into @anotherTable
values
(1,1,9),
(1,2,8),
(1,3,7),
(4,3,6),
(5,5,5)

select * from @myTable

update t
set t.aCol = case when t2.col_id = 1 then t2.someValue else t.aCol end,
    t.bCol = case when t2.col_id = 3 then t2.someValue else t.bCol end
from @myTable t
left join @anotherTable t2 on t2.row_id = t.row_id
where t2.col_id IN (1,2,3,5)

select * from @myTable

这不会更新第一行的bCol,它应该是...

row_id  aCol    bCol
1   9   0
2   0   0
3   0   0
4   0   6
5   0   0

3 个答案:

答案 0 :(得分:1)

试试这个 -

update myTable
set aColumn = (case when t2.someValue = 3 then 1 else 0 end)
from myTable
inner join anotherTable t2 on t2.id = myTable.id

答案 1 :(得分:1)

从你的编辑...你有一个1:很多的关系,这就是为什么它没有发生。 @anotherTable中有3行可以在@myTable中连接到tod_id = 1。这就是您的更新无法正常运行的原因。

declare @myTable table  (row_id int, aCol int, bCol int)

insert into @myTable
values
(1,0,0),
(2,0,0),
(3,0,0),
(4,0,0),
(5,0,0)

declare @anotherTable table (row_id int, col_id int, someValue int)
insert into @anotherTable
values
(1,1,9),
(1,2,8),
(1,3,7),
(4,3,6),
(5,5,5)

select 
    t.* 
    ,t2.*
from @myTable t
left join @anotherTable t2 on t2.row_id = t.row_id
where t2.col_id IN (1,2,3,5)


+--------+------+------+--------+--------+-----------+
| row_id | aCol | bCol | row_id | col_id | someValue |
+--------+------+------+--------+--------+-----------+
|      1 |    0 |    0 |      1 |      1 |         9 | --notice the implied cross join as 
|      1 |    0 |    0 |      1 |      2 |         8 | --row_id 1 is duplicated
|      1 |    0 |    0 |      1 |      3 |         7 | --3 times
|      4 |    0 |    0 |      4 |      3 |         6 |
|      5 |    0 |    0 |      5 |      5 |         5 |
+--------+------+------+--------+--------+-----------+

答案 2 :(得分:0)

好的,鉴于上面的建议 - 尤其是来自SCSimon - 我必须承认,我试图做的事情是不寻常的,并且太多的边缘情况,对于SQL(几乎任何风格)都无法理解。

我已经将12个单独列的更新作为单独的更新语句。

可能并不优雅,但它可以正常工作。 我也怀疑它实际上需要比复杂查询更长的时间。