2013-10-31 176 views
1

我注意到我的数据库中的一个表包含重复的行。这发生在各种日期。Sybase删除重复数据

当我运行此查询

select ACC_REF, CIRC_TYP, CIRC_CD, count(*) from table 

group by ACC_REF, CIRC_TYP, CIRC_CD 

having count(1)>1 

我可以看到哪些是重复的行和多少次excists(似乎总是2)。

该行做对他们有唯一的ID,而我认为这将是最好的与最新的ID删除值

我要选择的数据多数民众赞成复制,但只具有最高的ID,所以我可以在删除它之前将它移动到另一个表。

任何人都知道我可以做这个选择?

非常感谢

回答

0
select max(id) as maxid, ACC_REF, CIRC_TYP, CIRC_CD, count(*) 
from table 
group by ACC_REF, CIRC_TYP, CIRC_CD 
having count(*)>1 

编辑:

我觉得这是Sybase有效的,它会发现除了具有最低ID的所有副本

;with a as 
(
select ID, ACC_REF, CIRC_TYP, CIRC_CD, 
row_number() over (partition by ACC_REF, CIRC_TYP, CIRC_CD order by id) rn, 
from table 
) 
select ID, ACC_REF, CIRC_TYP, CIRC_CD 
from a 
where rn > 1 
0

尝试这样

SELECT t1.* FROM table t1, table t2 WHERE t1.id < t2.id AND t1.ACC_REF = t2.ACC_REF AND t1.CIRC_TYP = t2.CIRC_TYP AND t1.CIRC_CD = t2.CIRC_CD 
0

请试试这样:

SELECT t1.* 
FROM YOURTABLE t1 
INNER JOIN (
    SELECT max(id) ID, 
    ACC_REF, 
    CIRC_TYP, 
    CIRC_CD 
    FROM YOURTABLE 
    GROUP BY ACC_REF, 
    CIRC_TYP, 
    CIRC_CD 
    HAVING COUNT(id) > 1 
) t2 ON t2.id = t1.id; 
+0

嗨,两个行的id的值是不同的,所以我不能加入。 – rkyyk

+1

当然可以。这个连接只有MAX(id)为重复值,然后选择关于该行的所有信息。 –

+0

啊,我明白你的意思了,谢谢你的信息。我只是认为这是在身份证上。 – rkyyk

1

它只会输出当前表中的唯一值以及您为重复条目指定的条件。

这将允许您从一个单一的select语句执行“insert into new_table”一步。 无需删除然后插入。

select 
     id 
     ,acc_ref 
     ,circ_typ 
     ,circ_cd 
from(
     select 
      id 
      ,acc_ref 
      ,circ_typ 
      ,circ_cd 
      ,row_number() over (partition by 
              acc_ref 
              ,circ_typ 
              ,circ_cd 
           order by id desc 
           ) as flag_multiple_id 
     from Table 
    ) a 
where a.flag_multiple_id = 1 -- or > 1 if you want to see the duplicates