使用下面提到的标准编写一个查询来删除oracle数据库中的重复记录:

时间:2018-02-02 07:17:52

标签: mysql oracle select duplicates sql-update

标准: 1)2列(column1,column2)的唯一组合

2)保留最新的组合

3)记录可能相同,即同一列1,列2和创建日期在这种情况下需要具有较小id的那个。

e.g。数据如下:

ID      column1     column2     creation_date(dd-mm-yyyy)       
1       11          aa          10/5/2016
2       11          aa          11/6/2016
3       12          bb          10/5/2017
4       12          bb          20-05-2017
5       12          cc          10/5/2016
6       12          cc          11/5/2017
7       13          dd          10/1/2018
8       13          dd          10/1/2018

我需要保存id为1,3,5,7

的记录

我想到的方法是:

a)首先编写选择查询以获取所需记录(在此示例中为1,3,5,7)

b)使用更新查询(软删除)编写更新查询以将状态更改为已删除

另外,请建议是否有其他更好的方法来满足标准。

其他信息: *总记录数:11k

*我不想直接从表中获取记录,而不是我有一个只获取所需数据的查询,需要对这些记录运行查询

*最终目的是修改要删除的重复记录的状态,并将删除的字附加到这些记录

2 个答案:

答案 0 :(得分:0)

如果您使用分析函数,这非常简单。该查询包含三个部分:

A)为每条记录分配一个等级,如下所示:    按列1和列2分组记录。在每个组中,首先按creation_date对ID​​进行排序,然后按ID进行排序。将1分配给第一条记录,将2分配给第二条记录,依此类推。

B)仅保留重复项,即具有较新creation_date和/或ID的记录。 rnk = 1的记录将是您请求的记录。记录与rnk> 1是重复的。

C)使用ROWID删除重复项

delete
  from your_table
 where rowid in(-- (C) 
        select duplicate_rowid
          from (select rowid as duplicate_rowid
                      ,row_number() over( -- (A) 
                         partition by column1, column2    -- Your criterion 1
                             order by creation_date asc   -- Your criterion 2
                                     ,id            asc   -- Your criterion 3
                      ) as rnk
                  from your_table
                )
         where rnk > 1  -- (B) 
       );

答案 1 :(得分:0)

因此,针对我的问题的最终查询如下:

1)获取记录数/获取所需列:

 $professors = array("Andrew Besmer", "Gerry Derksen");

2)更新status = deleted的记录,并将_deleted word附加到column1值:

$professors[] = $andrewUser;
$professors[] = $gerryUser;
foreach ($professors as $professor) {
  echo "<h2>" . $professor->profile->getFirstName() . "</h2>";
  etc...
}