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

在T-SQL中将列设置为计数

  •  0
  • Rilcon42  · 技术社区  · 6 年前

    我试图将一个列设置为该值在表中出现的次数,但当我试图将其存储为一列时会遇到问题。我错过了什么?

    目标

       id col1 count
      --------------
       1   a    3
       2   a    3
       3   a    3
       4   b    2
       5   b    2
    

    我试过了:

    select count(col1) as repidck 
    from [User] u 
    group by u.id
    

    它本身就起作用,但是当我试图设置一个列时,

    update [User] 
    set [count] = (select count(col1) as repidck 
                   from [User] u 
                   group by u.id)
    

    错误:

    子查询返回了多个值。当子查询后接=,,则不允许这样做!=、<、<=、>、>=或将子查询用作表达式时。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    您可以使用相关的子查询。一种方法是:

    update u
        set [count] = (select count(col1) from [User] u2 where u2.id = u.id)
        from [User] u;
    

    但我可能会使用可更新的CTE:

    with toupdate as (
          select u.*, count(u.col1) over (partition by u.id) as new_count
          from [User] u
         )
    update toupdate
        set [count] = new_count;
    

    注: count user 是标识符的糟糕名称,因为它们与SQL关键字冲突。

        2
  •  0
  •   Juan Carlos Oropeza    6 年前
    update [User] u1
    set [count] = (select count(*) 
                   from [User] u2 
                   where u1.col1 = u2.col1)
    
        3
  •  0
  •   Trevor    6 年前

    我通常会通过创建 FROM 子句计算所需的数据,然后将其重新联接到原始表中。

    UPDATE [user]
    SET [count] = repidck
    FROM
        [user]
        INNER JOIN 
        (
            SELECT col1, COUNT(*) repidck
            FROM [user]
            GROUP BY col1
        ) counts
            ON counts.col1 = [user].col1
    

    希望这有帮助