0

这是我的桌面测试

id   identifier
---  ---------
1      zz
1      zzz
3      d 
5      w
7      v
8      q
9      cc
9      ccc

在这里,我想删除重复的 id 并保留最新的 id。标识符可以有重复的值,这无关紧要,但 id 应该是唯一的。

我写了这个查询来解决这个问题,但问题是它进入了一个无限循环。

请帮我解决这个问题,因为我看不到错误。谢谢

 delete test
    from test
    inner join(
    select max(id) as lastId, identifier
    from test
    where id in (
              select id 
                from test
               group by id
              having count(*) > 1
       )
    group by id
    )dup on dup.id = test.id
    where test.id<dup.id
4

4 回答 4

0

看看如何用 SQL 删除重复的行?

并尝试这个(适用于您想要做的),我使用标识符列,但使用帖子中显示的日期列更好。

DELETE FROM Test WHERE Identifier NOT IN
    (SELECT MAX(Identifier) FROM Test GROUP BY Id);

现在使用 DateField:

id   identifier   DateField
---  ---------    ----------
1      zz         2013-02-01
1      zzz        2013-03-02
3      d          2013-03-02
5      w          2013-03-02
7      v          2013-03-02
8      q          2013-03-02
9      cc         2013-01-15
9      ccc        2013-03-02

也就是表,并且行 (1, zzz) 比 (1,zz) 新,你可以通过 DateField 列知道它,然后这个查询删除两行 (1, zz) 和 (9, cc) 最旧的ID 是 1 和 9。

DELETE FROM Test WHERE Datefield NOT IN
    (SELECT MAX(Datefield) FROM Test GROUP BY Id);

在 SQL Server 2008 R2 中我没有收到任何错误。

于 2013-04-02T00:26:30.767 回答
0

如果您在 上有一个索引test(id, identifier),则以下内容应该非常有效:

delete from test
    where test.identifer < (select maxid 
                            from (select max(identifier) as maxid from test t2 where t2.id = t.id
                                 ) a
                           )

双嵌套查询是 MySQL 在同一查询中引用更新/删除表的技巧。

于 2013-04-02T01:13:29.940 回答
0

CREATE TEMPORARY TABLE tmp_tb_name AS
SELECT id,SUBSTRING_INDEX(GROUP_CONCAT(identifier ORDER BY id DESC),',',1)
FROM tb_name GROUP BY id ORDER BY NULL;

截断表 tb_name;

插入到 tb_name 选择 tmp_tb_name;

如果存在 tmp_tb_name 则删除临时表;

于 2013-04-03T07:36:48.933 回答
0

更新 我找到了解决问题的方法:这就是我解决问题的方法 当表中有数百万个实体时,这是对我有用的解决方案。任何其他 SQL 查询都会创建大量进程并给服务器带来负担。

$i=0;
    while($i<10)
    {

        $statement="SELECT * 
                      FROM  test 
                      WHERE  id = :i";
        $query=$db->prepare($statement);
        $query->bindParam(':i',$i,PDO::PARAM_INT);
        $query->execute();
        $results=$query->fetchAll(PDO::FETCH_ASSOC);
        $c=count($results);
        $temp=$results[$c-1];

        $statement="DELETE FROM test WHERE id= :i";
           $query=$db->prepare($statement);
             $query->bindParam(':i',$i,PDO::PARAM_INT);
             $query->execute();

        $statement="Insert into test values(:id,:identifier)";
        $query=$db->prepare($statement);
             $query->bindParam(':id',$temp['id'],PDO::PARAM_INT);
             $query->bindParam(':identifier',$temp['identifier'],PDO::PARAM_STR);
             $query->execute();
             $results=$query->fetchAll(PDO::FETCH_ASSOC);

        $i++;

    }
于 2013-06-21T16:14:26.083 回答