基于 COUNT 的 SQL UPDATE

bet*_*eta 3 sql-server join aggregate sql-update

我有一张看起来如下的表格

ID   |   action   |  flag
1    |   A        |  1
1    |   A        |  1
1    |   B        |  1
2    |   A        |  1
2    |   A        |  1
2    |   B        |  1
2    |   B        |  1
Run Code Online (Sandbox Code Playgroud)

我想执行以下操作:如果对于相同的ID的值动作列出现多于1次,然后我想将设置标志此列ID0

结果应如下所示:

ID   |   action   |  flag
1    |   A        |  1
1    |   A        |  1
1    |   B        |  1
2    |   A        |  0
2    |   A        |  0
2    |   B        |  0
2    |   B        |  0
Run Code Online (Sandbox Code Playgroud)

我知道有两种方法可以做到这一点:

  • 使用子查询:但是,我不想使用子查询,因为我处理的是大表,而子查询会降低性能
  • 使用临时查找表:我创建了一个临时的查找表,我在其中存储的ID具有价值行动科拉姆超过1次,而我则join随原表的临时表中查找的ID为我将将标志设置为0

除了上面解释的两个之外,还有其他选择吗?理想情况下在一个查询中(没有子查询和临时查找表)。我正在考虑类似 a JOINwhereJOIN子句包含 a GROUP BYand 之类的东西HAVING,但直到现在我才成功..

Zoh*_*led 5

这样的事情应该适合你:

UPDATE t
SET flag = 0
FROM Table t
INNER JOIN 
(
    SELECT Id
    FROM Table
    WHERE action = 'B'
    GROUP BY Id
    HAVING COUNT(*) > 1
) d ON t.Id = d.Id
Run Code Online (Sandbox Code Playgroud)