Mysql 更新除一行之外的重复行

Mysql 更新除一行之外的重复行,mysql,sql,Mysql,Sql,我有一个名为simple_data的表,在一个名为MSISDN的列中有数百万个移动电话号码,但它包含重复项 所有行的标志列都设置为零 我想通过将标志值设置为2(一行除外)来更新所有重复的行 CREATE TABLE `wt_simple_data` ( `SIMPLEID` int(10) NOT NULL AUTO_INCREMENT, `CAMPID` bigint(20) NOT NULL, `MSISDN` bigint(20) NOT NULL, `FLAG` enum

我有一个名为simple_data的表,在一个名为MSISDN的列中有数百万个移动电话号码,但它包含重复项

所有行的标志列都设置为零

我想通过将标志值设置为2(一行除外)来更新所有重复的行

CREATE TABLE `wt_simple_data` (
  `SIMPLEID` int(10) NOT NULL AUTO_INCREMENT,
  `CAMPID` bigint(20) NOT NULL,
  `MSISDN` bigint(20) NOT NULL,
  `FLAG` enum('0','1','2') DEFAULT '0' COMMENT '0 FOR NOT SENT, 1 FOR SENT',
  PRIMARY KEY (`SIMPLEID`)

) ENGINE=InnoDB  DEFAULT CHARSET=latin1
一些样本数据:

SIMPLEID  CAMPID     MSISDN        FLAG    
 15        311      9874123411      0    
 16        311      9874123411      0    
 17        311      9874123411      0    
 18        311      9874123412      0    
 19        311      9874123412      0    
 20        311      9874123413      0    
 21        311      9874123413      0    
 22        311      9874123414      0
我想要的结果

SIMPLEID  CAMPID     MSISDN        FLAG    
 15        311      9874123411      0    
 16        311      9874123411      2    
 17        311      9874123411      2    
 18        311      9874123412      0    
 19        311      9874123412      2    
 20        311      9874123413      0    
 21        311      9874123413      2    
 22        311      9874123414      0
通用SQL:

UPDATE wt_simple_data
SET flag='2'
WHERE simpleid IN (
    SELECT simpleid FROM wt_simple_data WHERE flag = '0'
    MINUS
    SELECT MIN(simpleid) FROM wt_simple_data WHERE flag = '0'
    GROUP BY msisdn
)
使用分析函数:

UPDATE wt_simple_data
SET flag='2'
WHERE simpleid IN (
    SELECT simpleid
    FROM (
        SELECT MIN(simpleid) OVER (PARTITION BY msisdn) minsimpleid, simpleid
        FROM wt_simple_data
        WHERE flag = '0')
    WHERE minsimpleid <> simpleid
)
通用SQL:

UPDATE wt_simple_data
SET flag='2'
WHERE simpleid IN (
    SELECT simpleid FROM wt_simple_data WHERE flag = '0'
    MINUS
    SELECT MIN(simpleid) FROM wt_simple_data WHERE flag = '0'
    GROUP BY msisdn
)
使用分析函数:

UPDATE wt_simple_data
SET flag='2'
WHERE simpleid IN (
    SELECT simpleid
    FROM (
        SELECT MIN(simpleid) OVER (PARTITION BY msisdn) minsimpleid, simpleid
        FROM wt_simple_data
        WHERE flag = '0')
    WHERE minsimpleid <> simpleid
)

您可以使用JOIN并将第一条记录保留为0


您可以使用JOIN并将第一条记录保留为0

你能试试这个吗

UPDATE a 
SET a.Flag = 2
FROM wt_simple_data a
INNER JOIN (SELECT MIN(SIMPLEID) SIMPLEID, CAMPID, MISSION 
                     FROM wt_simple_data
         GROUP BY CAMPID, MISSION
                    ) ON a.CampId = b.CampId AND a.Mission = b.Mission AND a.SimpleId > b.SimpleId
你能试试这个吗

UPDATE a 
SET a.Flag = 2
FROM wt_simple_data a
INNER JOIN (SELECT MIN(SIMPLEID) SIMPLEID, CAMPID, MISSION 
                     FROM wt_simple_data
         GROUP BY CAMPID, MISSION
                    ) ON a.CampId = b.CampId AND a.Mission = b.Mission AND a.SimpleId > b.SimpleId

你使用了你标记的所有数据库?是的,我在所有数据库中寻找逻辑,我在所有数据库中都有意识,我标记这些数据库不仅仅是为了防止标记产品不涉及。。。如果是与产品无关的问题,请使用ANSI SQL!你使用了你标记的所有数据库?是的,我在所有数据库中寻找逻辑,我在所有数据库中都有意识,我标记这些数据库不仅仅是为了防止标记产品不涉及。。。如果是与产品无关的问题,请使用ANSI SQL!当你更新数以百万计的记录时,不幸的是没有任何快捷方式,这将消耗一些时间。然而,有索引可能会使它更快,但它不可能是超快速的。但是,是的,查询应该可以工作。当你更新数百万条记录时,不幸的是没有任何快捷方式,这将花费一些时间。然而,有索引可能会使它更快,但它不可能是超快速的。但是,是的,这个查询应该是有效的。