1

データベース内のテーブルに重複した行が含まれていることに気付きました。これはさまざまな日に発生しました。

このクエリを実行すると

 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

4 に答える 4

1

重複するエントリに対して指定した基準とともに、現在のテーブルから一意の値のみを出力します。

これにより、1 つの select ステートメントから "insert into new_table" という 1 つのステップを実行できます。削除してから挿入する必要はありません。

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
于 2013-11-01T13:24:31.520 に答える
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
于 2013-10-31T10:24:24.437 に答える
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;
于 2013-10-31T10:24:45.820 に答える
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
于 2013-10-31T10:16:50.853 に答える