SQL Server: IF EXISTS ; ELSE

70

我有一个表格A:

ID value
 1  100
 2  101
 2  444
 3  501

还有 TableB

ID Code
1
2

现在我想在表B中的列code中填充值,如果表A中存在ID=2,则填充最大值。对于多个值,获得最大值。否则,用'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部分的选择语句存在,则要绕过else部分,反之亦然。例如,如果IF部分的选择语句为:

(select MAX(value) from #A where id = 4)

应该只填充123,因为ID = 4不存在!

3个回答

104

编辑

我想解释一下你的IF语句为什么似乎不起作用。当你在聚合函数上使用EXISTS时,它总是会返回true。即使ID不存在,它也会返回一个值。当然,这个值是NULL,但它依然存在。相反地,请采用以下方法:

if exists(select 1 from table where id = 4)

然后您将会进入 IF 语句的 ELSE 部分。


现在,这里有一个更好的基于集合的解决方案:

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。

6

试试这个:

Update TableB Set
  Code = Coalesce(
    (Select Max(Value)
    From TableA 
    Where Id = b.Id), 123)
From TableB b

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接