我有一个存储用户所属关联状态的表。用户可以是学生,教师,员工,承包商或任何组合。这意味着对于用户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只返回每个联属类型一条记录,但我不确定是否可以仅使用此查询删除。救命啊!
答案 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> )