2013-10-31 221 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