【问题标题】:Delete the duplicate rows from table having foreign key of another table?从具有另一个表的外键的表中删除重复的行?
【发布时间】:2017-03-02 14:23:00
【问题描述】:

我有两张桌子employeedepartments。 员工表有

ID , name ,  salary, dep_ID
1  | john |  2300  | 1
2  | smith|  1500  | 2
3  | john |  2300  | 1

这里的dep_idforeign key

现在部门

id, name
1 | COMPUTER SCIENCE
2 | MATHEMATICS

现在我要做的是“从员工表中删除所有重复的行”

【问题讨论】:

  • MySQL 还是 oracle?您使用的是哪个数据库?
  • @Viki888 根据 OP 给出的示例数据,删除重复项非常好。 'john' 的两行都有相同的部门 ID。
  • 为什么需要 DEPARTMENT 表呢?你问问题的方式,你不需要它;但也许您的问题比您在帖子中提出的更多。那么:你如何定义“重复”?您的 EMPLOYEE 表中没有重复项,因为它们在 ID 列中是不同的。您的意思是“除了 ID 列”吗?

标签: sql database duplicates foreign-keys subquery


【解决方案1】:
delete  from Employee
where   id not in
        (
        select  minid
        from    (
                select  min(id) as minid
                from    Employee
                group by
                        name
                ,       salary
                ,       dep_ID
                ) sub
        )

Example at rextester.com.

【讨论】:

  • @UsamaHaleem 请定义“不工作”。此查询解决了问题正如您所说的那样
  • 也许在 MySQL 中你需要另一个子查询?在答案中编辑
  • @UsamaHaleem 如果此答案解决了您的问题,请将其标记为已接受(使用旁边的“检查”按钮)。
【解决方案2】:

对于 SQL..

在 dep_ID 列上添加唯一索引。编写 ALTER 语句时,请包含 IGNORE 关键字:

ALTER IGNORE TABLE 员工 添加唯一索引 idx_name (dep_ID);

这将删除所有重复的行,并避免将来重复插入。

【讨论】:

    【解决方案3】:

    如果您不介意使用多个语句和一个临时表,此解决方案适用于任何 dbms:

    create table tmp as
    select min(ID), name, salary, dep_ID
    from employee
    group by name, salary, dep_ID;
    
    truncate table employee;
    
    insert into employee
    select * from tmp;
    
    drop table tmp;
    

    【讨论】:

    • ID 列不包含重复项
    • @Andomar 这就是我将 ID 与 min() 分组的原因
    • 哎呀,你是对的,我什至使用相同的查询:)
    • 假设如果我们有超过 40 列,那么我们必须在 group by 语句中提及所有列,或者是否有任何有效的方法可以在不提及所有列的情况下做到这一点?因为大型数据库可能有更多列
    • 恐怕你不得不提到 group by 和 select 子句中的所有列。
    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2019-09-30
    • 2019-10-10
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多