代码之家  ›  专栏  ›  技术社区  ›  user4134476

根据同一表中特定记录的计数更新表

  •  1
  • user4134476  · 技术社区  · 4 年前

    Id   groupName    flag    type 
    --------------------------------
    1    aaa          0        0   
    2    aaa          1        0 
    3    aaa          0        0 
    4    bbb          0        0   
    5    bbb          0        0 
    6    bbb          0        0 
    

    我想更新 type 列值基于同一表中特定记录的计数。

    假设记录按 groupName ,如果一个组至少有一条记录 flag =1,则 类型 同一组中所有记录的值应为1,否则为0。

    在我的例子中,我希望得到以下输出。

    Id   groupName    flag    type 
    --------------------------------
    1    aaa          0        1   
    2    aaa          1        1 
    3    aaa          0        1 
    4    bbb          0        0   
    5    bbb          0        0 
    6    bbb          0        0 
    

    如何使用SQL语句执行此操作?

    编辑

    UPDATE t1 
    SET type = CASE
                  WHEN ((SELECT COUNT(*) FROM tg) > 0) 
                     THEN 1 
                     ELSE 0 
               END 
    FROM [sampleDB].[dbo].[groups] t1 
    JOIN (SELECT t2.groupName, t2.flag 
          FROM [sampleDB].[dbo].[groups] t2) tg ON tg.groupName = t1.groupName 
                                                AND tg.flag = 1;
    
    3 回复  |  直到 4 年前
        1
  •  1
  •   Fahmi    4 年前

    你可以试试下面的方法-

    UPDATE t
    SET
        type = case when cnt>=1 then 1 else 0 end
    FROM 
        tablename t
        INNER JOIN (select group_name, count(case when flag=1 then 1 end) as cnt from tablename 
                    group by group_name)t1
            ON t.group_name= t1.group_name
    
        2
  •  0
  •   eshirvana    4 年前
    update t1
    set type = 1
    from table t1
    where exists ( select 1 
                   from table t2 
                   where t1.groupname = t2.groupname 
                   and flag = 1
                  )
    
        3
  •  0
  •   Ilyes    4 年前

    您可以简单地使用一个简单的连接:

    UPDATE D
    SET Type = 1
    FROM Data D JOIN
    (
      SELECT GroupName
      FROM Data
      WHERE Flag = 1
    ) T ON D.GroupName = T.GroupName;
    

    这是一个 db-fiddle