【问题标题】:SQL Server: IF EXISTS ; ELSESQL Server:如果存在;别的
【发布时间】:2011-11-17 12:24:12
【问题描述】:

我有一张桌子A:

ID value
 1  100
 2  101
 2  444
 3  501

还有表B

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 不存在!

【问题讨论】:

    标签: sql sql-server if-statement exists


    【解决方案1】:

    编辑

    我想补充一下您的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 上运行。

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

        【解决方案3】:

        我知道距离最初的帖子已经有一段时间了,但我喜欢使用 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-25
          • 1970-01-01
          • 2015-10-15
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          相关资源
          最近更新 更多