Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从单个列中删除重复项_Mysql_Sql - Fatal编程技术网

Mysql 从单个列中删除重复项

Mysql 从单个列中删除重复项,mysql,sql,Mysql,Sql,我有一张这样的桌子: 桌子 我需要删除重复项,而不是创建新表。 一种方法是: create table_new (select distinct id from table ) 是否有删除重复项的命令?第一次点击谷歌: 本文描述了使用临时表来保存唯一记录,清除原始表并将唯一记录添加回其中,您可能可以通过编写一些存储过程来完成这项工作,但我想您只需要执行一次?然后我将使用所描述的方法。此外,为了防止将来出现问题,请在该字段上使用“唯一”或“主键”约束,这样就不可能有两条具有相同值的记录。第一次点

我有一张这样的桌子:

桌子

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

create table_new (select distinct id from table )
是否有删除重复项的命令?

第一次点击谷歌:

本文描述了使用临时表来保存唯一记录,清除原始表并将唯一记录添加回其中,您可能可以通过编写一些存储过程来完成这项工作,但我想您只需要执行一次?然后我将使用所描述的方法。此外,为了防止将来出现问题,请在该字段上使用“唯一”或“主键”约束,这样就不可能有两条具有相同值的记录。

第一次点击谷歌:

本文描述了使用临时表来保存唯一记录,清除原始表并将唯一记录添加回其中,您可能可以通过编写一些存储过程来完成这项工作,但我想您只需要执行一次?然后我将使用所描述的方法。此外,为了防止将来出现问题,请在该字段上使用“唯一”或“主键”约束,这样就不可能有两条具有相同值的记录。

您可以使用cte:

;WITH cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY ID 
                                       ORDER BY ( SELECT 0)) RN
         FROM   #MyTable)
DELETE FROM cte
WHERE  RN > 1
这将避免为不同的记录创建临时表或保留表。如果您有可能包含重复值的其他列,则可以将它们添加到分区BY表达式中的ID之后

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

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

;WITH cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY ID 
                                       ORDER BY ( SELECT 0)) RN
         FROM   #MyTable)
DELETE FROM cte
WHERE  RN > 1
这将避免为不同的记录创建临时表或保留表。如果您有可能包含重复值的其他列,则可以将它们添加到分区BY表达式中的ID之后

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

如果这是一个行ID,那么我建议使用IDENTITY和 自动增加ID。 如果它是一个项目或参考ID,那么我会尽量避免添加重复项。根据您的结构,这可能是完全错误的
删除Oracle中测试的所有重复项的单个查询

从rowid不在的my_表中删除从中选择minrowid 按id对临时表进行分组

说明:

Oracle默认给每一行一个rowid,我相信其他数据库也有相同或类似的东西

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


外部删除查询很简单,它只是从表中删除所有其他重复项,而这些重复项不是由内部查询返回的

从rowid不在的my_表中删除从中选择minrowid 按id对临时表进行分组

说明:

Oracle默认给每一行一个rowid,我相信其他数据库也有相同或类似的东西

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

外部删除查询很简单,它只是从表中删除所有其他重复项,而这些重复项不是由内部查询返回的示例代码

示例代码


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

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
// )
} 

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

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
// )
} 

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

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

在常见情况下,Ansi SQL不能这样做,因为没有唯一键字段您无法区分一行和另一行,因此无法删除它

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

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

通常情况下,Ansi SQL无法执行此操作,因为没有唯一的键字段,您无法区分一行和另一行,因此无法删除它

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

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

是否有任何标准的删除查询可以在所有databases@Mdharmendra在mysql上没有太多工作,b
但这似乎就是你要找的,是否有任何标准的删除查询在所有方面都有效databases@Mdharmendra在mysql上没有太多工作,但这似乎就是你要寻找的可能重复的See here:可能重复的See here:谢谢,但我的表格中只有一列,所以你的例子不适合我的情况谢谢,但我的表格中只有一列,所以你的例子不适合我的情况