如何创建仅包含重复行的 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
);
我想在 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
);