从单个列中删除重复项

时间:2012-08-08 06:45:55

标签: mysql sql

我有一张这样的表:

id
=====
1
1
2
2
6
6
7
5
5
9

除了创建新表之外,我需要删除重复项。 一种方法是:

create table_new (select distinct id from table )

是否有删除重复项的删除命令?

7 个答案:

答案 0 :(得分:1)

恕我直言(Ansi SQL)你不能这样做,因为没有唯一的键字段,你无法区分一行,所以你不能删除它。

但是在MySQL中你可以运行这个UGLY查询。它使用@S sting来累积ID,所以不要在大桌子上使用它:

set @S:=',';
delete from t 
where if(LOCATE(CONCAT(',',ID,','),@S)>0,'del',@S:=CONCAT(@S,ID,','))='del'

答案 1 :(得分:0)

首先点击谷歌:

  

http://support.microsoft.com/kb/139444/en-us?fr=1

本文描述了使用临时表来保存唯一记录,清除原始表并将唯一记录添加回它,你可以通过编写一些存储过程来实现,但我想你只需要这样做一旦?然后我会按照描述的方法。另外,为了防止将来出现问题,请在该字段上使用唯一或主键约束,以便不可能有2条具有相同值的记录。

答案 2 :(得分:0)

您可以使用cte:

;WITH cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY ID 
                                       ORDER BY ( SELECT 0)) RN
         FROM   #MyTable)
DELETE FROM cte
WHERE  RN > 1

这将避免为您的不同记录创建临时表或保留表。如果您有其他可能包含重复值的列,则可以在ID表达式中PARTITION BY之后添加它们。

虽然我会担心你为什么会有重复的ID值。

  • 如果这是一个行ID,那么我建议使用IDENTITY和 自动递增ID。
  • 如果是项目或参考ID,那么我会尽量避免添加重复项(根据您的结构,这可能完全错误)

答案 3 :(得分:0)

删除所有重复项的单个查询(在Oracle中测试)

  

从my_table中删除rowid不在其中(从中选择min(rowid))   temp_table group by id);

说明:

Oracle默认为每行提供一个rowid(我确信其他数据库有相同或类似的东西)。

让我们先看一下内部查询。 Group by子句根据某些条件对行进行分组,在我们的示例中为Id。我们也可以根据多个列进行分组(按col1,col2分组)。当我们说min(rowid)时,我们只是确保它返回一个rowid,以防有多个行有重复的列。

外部删除查询很简单,它只是从表中删除其他内容(重复),而内部查询没有返回

答案 4 :(得分:0)

答案 5 :(得分:0)

我不确定是否有任何直接实现,但这是一个你可能感兴趣的函数实现。

function RemoveDuplicates($TableName, $UniqueFieldName, $IDFieldName, $FirstFoundIDValue)
{
    $Query =    "DELETE  FROM ".$TableName." ".
                "WHERE    ".$IDFieldName." IN ".
                "( SELECT a.".$IDFieldName." ".
                    "FROM ".$TableName." a, ".$TableName." b ".
                    "WHERE (a.".$UniqueFieldName." = b.".$UniqueFieldName.") ".
                    "AND (a.".$IDFieldName." > ".$FirstFoundIDValue.") ".
                    "GROUP BY a.".$IDFieldName." ".
                    "HAVING COUNT(a.".$UniqueFieldName.") > 1 ".
                ")";
    db_query($Query);

// Example Use:            
// delete  from tblps_CommEquip 
// where PSID in    
// ( select a.PSID from tblps_CommEquip a, tblps_CommEquip b     
//      where    (a.CommEquipType = b.CommEquipType) 
//      AND (a.PSID > 80)    
//      group by a.PSID 
//      having count(a.CommEquipType) > 1
// )
} 

答案 6 :(得分:0)

删除重复行的最佳方法是提供唯一标识表中每条记录的主键列。