我有一个更新查询,其格式为:
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
答案 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个单独列的更新作为单独的更新语句。
可能并不优雅,但它可以正常工作。 我也怀疑它实际上需要比复杂查询更长的时间。