【问题标题】:SQL UPDATE only DuplicatesSQL UPDATE 仅重复
【发布时间】:2017-01-11 12:32:09
【问题描述】:

我有一个这样的 SQL 表:

+------+------------+---------+---------+--------+
| id   | x          | y       | z       | status |
+------+------------+---------+---------+--------+
|    1 |        bla |      ja | 1       |   0    |
|    2 |       blaa |     jaa | 2       |   0    |
|    3 |        bla |      ja | 1       |   0    |
|    4 |      blaaa |    jaaa | 3       |   0    |
|    5 |       blaa |     jaa | 2       |   0    |
+------+------------+---------+---------+--------+

我只想更新重复行的状态列,而不是第一个。

使用该语句,我会更新每个重复的重复行的第一行:

UPDATE table INNER JOIN 
       (SELECT x, y, z FROM table GROUP BY x,y,z HAVING COUNT(id) > 1) 
dup
        ON table.x = dup.x && table.y = dup.y && table.z = dup.z 
    SET status = '1'

但这是不对的,因为表必须像这样处理 UPDATE 语句:

+------+------------+---------+---------+--------+
| id   | x          | y       | z       | status |
+------+------------+---------+---------+--------+
|    1 |        bla |      ja | 1       |   0    |
|    2 |       blaa |     jaa | 2       |   0    |
|    3 |        bla |      ja | 1       |   1    |
|    4 |      blaaa |    jaaa | 3       |   0    |
|    5 |       blaa |     jaa | 2       |   1    |
+------+------------+---------+---------+--------+

我希望你能帮助我。

非常感谢。

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题。
  • 你的预期结果是什么?

标签: sql duplicates sql-update inner-join


【解决方案1】:

只需使用如下所示的选择语句,直到获得重复项列表,然后如图所示进行更新。

UPDATE table set status = '1'
WHERE ID in (select id from(Select ROW_NUMBER() OVER (Partition By x,y,z,status) as dup,id) where dup>1)

没有说 RDBMS,所以这是针对 SQL Server 的

【讨论】:

    【解决方案2】:

    我相信这就是你想要的:

    UPDATE table t INNER JOIN 
           (SELECT x, y, z, MIN(id) as minid
            FROM table
            GROUP BY x, y, z
            HAVING COUNT(id) > 1  -- not strictly necessary, but why not?
           ) dup
           ON t.x = dup.x AND t.y = dup.y AND t.z = dup.z AND
              t.id > dup.minid
        SET status = 1;
    

    这会计算每个组的最小 id,然后更新所有其他行。

    【讨论】:

    • 还有一个问题:是否可以将每个第一个原始条目中的 ID 放到每个副本中?
    • @wp-developer 。 . .当然。只需在set 中使用minid
    • 完美。非常感谢。
    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2013-01-08
    相关资源
    最近更新 更多