使用唯一ID在一对多子表中选择重复项

时间:2013-11-22 15:26:49

标签: sql oracle duplicates

我有一个存储用户所属关联状态的表。用户可以是学生,教师,员工,承包商或任何组合。这意味着对于用户105433,他可以在该表中显示为4行。不幸的是,最近一组新员工已经两次插入到表中,因此用户可以为同一个联盟提供重复的行。

示例行:

Role_ID - Employee_ID - 员工类型

10000 - 203398 - 教师

10001 - 203398 - 教师

10002 - 203398 - 学生

10003 - 203542 - 工作人员

10004 - 203542 - 工作人员

10005 - 204844 - 工作人员

10006 - 204844 - 学生

我想删除重复的行,并留下:

10000 - 203398 - 教师

10002 - 203398 - 学生

10003 - 203542 - 工作人员

10005 - 204844 - 工作人员

10006 - 204844 - 学生

我已经创建了一个单独的表,并使用在复制当天插入的所有数据填充它(如果有用的话)。

我使用了这个查询:

select tablename.*

from tablename

inner join (

        select MAX(role_id) as id from tablename GROUP BY employee_id

        )maxid ON tablename.role_id = maxid.id

        order by employee_id

每个EMPLOYEEID只返回每个联属类型一条记录,但我不确定是否可以仅使用此查询删除。救命啊!

2 个答案:

答案 0 :(得分:2)

SELECT Role_ID, Employee_ID, Employee_Type, COUNT(*) AS cnt
FROM yourtable
GROUP BY Role_ID, Employee_ID, Employee_Type
HAVING cnt > 1

这将为您提供所有重复的记录。您可以将其选择为临时表,然后使用结果开始删除记录。

答案 1 :(得分:1)

如果您不确定查询列中的数据是否足够独特,只能为每个可能的副本标识一条记录,我建议您将ROWID添加到查询列中以确保。 e.g。

SELECT tablename.*, tablename.ROWID as DEL_ROWID
....

ROWID的值唯一标识单个记录。你甚至可以在where子句中使用它们:

DELETE FROM tablename WHERE ROWID IN
  ( SELECT tablename.ROWID
    FROM ...... <same query>  )