如何创建仅包含重复行的 table 并从主 table 中删除重复项?

how to create a table with only the duplicate rows and delete the duplicates from the main table?

我想在 Oracle 中创建一个临时 table,我可以只保留主 table 中的重复行,然后从主 table 中删除重复行。这里的主要table是tmp_emp_area.

SQL> desc tmp_emp_Area
 Name                            Null?    Type
 ------------------------------- -------- ----
 SC_CD                                    VARCHAR2(2)
 DIST_CD                                  VARCHAR2(2)
 THA_CD                                   VARCHAR2(2)
 UN_CD                                    VARCHAR2(3)
 FP_ID                                    VARCHAR2(4)
 S_DT                                     DATE
 END_DT                                   DATE
 PERFORM                                  VARCHAR2(1)
 BS_CD                                    VARCHAR2(4)
 MKT_CD                                   VARCHAR2(3)

查询:

select SC_CD,DIST_CD,THA_CD,UN_CD,FP_ID,count(fp_id)  
from tmp_emp_area 
group by SC_CD,DIST_CD,THA_CD,UN_CD,FP_ID 
having count(fp_id)>1

结果:

SC DI TH UN_ FP_I COUNT(FP_ID)
-- -- -- --- ---- ------------
14 61 02 022 5J85            2
14 61 02 098 5J85            3
14 64 02 004 5J85            2
14 64 02 002 5J85            2
14 60 19 060 5F77            2
14 60 13 077 5F77            2
14 61 06 006 5D51            2
14 61 07 013 5D51            2
14 61 07 083 5D51            2
14 61 06 010 5D51            2
14 61 01 015 5R44            2
14 61 08 027 5R44            2
14 61 01 057 5R44            2
14 61 01 067 5R44            2
14 61 05 001 5R44            2
14 61 05 003 5R44            2
14 61 02 009 5J85            2
14 60 13 078 5F77            2
14 61 06 007 5D51            2
14 61 01 021 5R44            2
14 61 01 029 5R44            2

i want to create a temporary table in oracle where i can just keep the duplicate rows from the main table

你可以使用解析函数ROW_NUMBER.

CREATE TABLE temp AS
SELECT SC_CD,
  DIST_CD,
  THA_CD,
  UN_CD,
  FP_ID
FROM
  (SELECT SC_CD,
    DIST_CD,
    THA_CD,
    UN_CD,
    FP_ID,
    row_number() over(partition BY SC_CD, DIST_CD, THA_CD, UN_CD, FP_ID order by FP_ID) rn
  FROM tmp_emp_area
  )
WHERE rn >1;

and then delete the duplicates from the main table

同上逻辑,可以根据主键删除,也可以根据ROWID.[=14删除=]

DELETE
FROM tmp_emp_area
WHERE ROWID IN
  (SELECT rowid
  FROM
    (SELECT rowid,
      row_number() over(partition BY SC_CD, DIST_CD, THA_CD, UN_CD, FP_ID order by FP_ID) rn
    FROM tmp_emp_area
    )
  WHERE rn >1
  );