我有一张桌子A:
ID value
1 100
2 101
2 444
3 501
同样是TableB
ID Code
1
2
现在我想在表A中存在ID = 2时填充表B的col =代码。对于多个值,获取最大值。 否则用'123'填充它。现在我使用的是:
if exists (select MAX(value) from #A where id = 2)
BEGIN
update #B
set code = (select MAX(value) from #A where id = 2)
from #A
END
ELSE
update #B
set code = 123
from #B
我确信在BEGIN; END或IF EXIST; ELSE中存在一些问题。 基本上,如果IF部分中的select语句存在,我想绕过else部分,反之亦然。例如,如果IF = part的select语句是:
(select MAX(value) from #A where id = 4)
它应该只填充123,因为ID = 4不存在!
答案 0 :(得分:84)
编辑
我想补充你的IF
语句似乎不起作用的原因。在聚合上执行EXISTS
时,它始终为true
。即使ID
不存在,它也会返回一个值。当然,它是NULL
,但它返回了它。相反,这样做:
if exists(select 1 from table where id = 4)
您将进入ELSE
声明的IF
部分。
现在,这是一个更好的,基于集合的解决方案:
update b
set code = isnull(a.value, 123)
from #b b
left join (select id, max(value) from #a group by id) a
on b.id = a.id
where
b.id = yourid
这样做的好处是能够在整个表格而不是单个ID上运行。
答案 1 :(得分:6)
试试这个:
Update TableB Set
Code = Coalesce(
(Select Max(Value)
From TableA
Where Id = b.Id), 123)
From TableB b
答案 2 :(得分:0)
我知道距原始帖子已经有一段时间了,但是我喜欢使用CTE,这对我很有效:
WITH cte_table_a
AS
(
SELECT [id] [id]
, MAX([value]) [value]
FROM table_a
GROUP BY [id]
)
UPDATE table_b
SET table_b.code = CASE WHEN cte_table_a.[value] IS NOT NULL THEN cte_table_a.[value] ELSE 124 END
FROM table_b
LEFT OUTER JOIN cte_table_a
ON table_b.id = cte_table_a.id