SQL Server:IF EXISTS; 其他

我有一张桌子

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,coz ID = 4不存在!

Bhupinder Singh asked 2019-11-08T09:21:51Z
3个解决方案
88 votes

编辑

我想补充一下您的ELSE语句似乎不起作用的原因。 在汇总上执行IF时,总会是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上运行。

Derek Kromm answered 2019-11-08T09:22:37Z
6 votes

试试这个:

Update TableB Set
  Code = Coalesce(
    (Select Max(Value)
    From TableA 
    Where Id = b.Id), 123)
From TableB b
Charles Bretana answered 2019-11-08T09:23:03Z
0 votes

我知道距原始帖子已有一段时间,但我喜欢使用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
HBSixtySix answered 2019-11-08T09:23:31Z
translate from https://stackoverflow.com:/questions/7425146/sql-server-if-exists-else