Sybase删除重复数据

时间:2013-10-31 10:00:45

标签: sql database duplicates sybase

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

当我运行此查询时

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

 group by ACC_REF, CIRC_TYP, CIRC_CD

 having count(1)>1

我可以看到重复的行以及它的次数(似乎总是2)。

行上有唯一的ID,我认为最好删除最新ID的值

我想选择重复但只有最高ID的数据,以便在删除之前将其移动到另一个表。

任何人都知道如何选择这个?

非常感谢

4 个答案:

答案 0 :(得分: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

答案 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

答案 2 :(得分: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

答案 3 :(得分: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;