DB2 SQL - 删除重复项,其中一些重复项有效

时间:2016-10-12 09:40:55

标签: sql db2 duplicates ibm-midrange

我想删除XRDK / ENAUDFP_RK中的重复记录,我已经尝试了一个' where exists'带有以下SQL的子句,但这删除了文件中的所有记录,而不仅仅是重复项。

给一点背景;这里的问题是一个重复的每日销售文件 - 商店完全有可能每天销售超过1个相同的商品,因此一些副本实际上不是重复的,只有每隔一行都是重复的。

即。如果商店出售其中2个相同的商品,则会有4个记录--2个正品销售,2个重复。

这是我用来突出重复项的SQL;

SELECT * FROM                                                     
  (SELECT ROWNUMBER() OVER (                                      
   PARTITION BY                                                   
   INCOMP, INTTYP, INTDAT, INMDAT, INSDAT, INTCCY, INERAT, INDEPT,
   INSTYL, INCOLO, INMATL, INSIZE, INFIT, INVENX, INEAN, INSKU,   
   INBATC, INPSIT, INFSIT, INTSIT, INSUPP, INPONO, INSCCY, INREF1,
   INREF2, INREF3, INSREF, INDREF, INUNIT, INRETL, INCOST, INLRET,
   INLCST, INSCST, INFGRP, INFCAT, INFSEC, INTGRP, INTCAT, INTSEC,
   INSTEN, INSTEV, INSVAT, INPLUL, INSVTF, INSFOR, INSFOV, INVCOD,
   INTO01, INSP01, INSP02, INSP03, INFNUM, INFDES, INRCOD, INRC01,
   INRC02, INRC03, INRC04, INRC05, INRC06, INRC07, INRC08, INRC09,
   INRC10, INRV01, INRV02, INRV03, INRV04, INRV05, INRV06, INRV07,
   INRV08, INRV09, INRV10, INDELD, INCUID, INIREF, INSOUR, INSNUM)
   AS RN, ENAUDFP_RK.*                                            
   FROM   XRDK/ENAUDFP_RK) AS A                                   
 WHERE RN in('2', '4', '6', '8', '10', '12')

2 个答案:

答案 0 :(得分:1)

您可以在DB2中使用rrn

DELETE FROM XRDK/ENAUDFP_RK f0
WHERE rrn(f0) in (
 SELECT RW FROM                                                     
 (SELECT ROWNUMBER() OVER (                                      
 PARTITION BY                                                   
 INCOMP, INTTYP, INTDAT, INMDAT, INSDAT, INTCCY, INERAT, INDEPT,
 INSTYL, INCOLO, INMATL, INSIZE, INFIT, INVENX, INEAN, INSKU,   
 INBATC, INPSIT, INFSIT, INTSIT, INSUPP, INPONO, INSCCY, INREF1,
 INREF2, INREF3, INSREF, INDREF, INUNIT, INRETL, INCOST, INLRET,
 INLCST, INSCST, INFGRP, INFCAT, INFSEC, INTGRP, INTCAT, INTSEC,
 INSTEN, INSTEV, INSVAT, INPLUL, INSVTF, INSFOR, INSFOV, INVCOD,
 INTO01, INSP01, INSP02, INSP03, INFNUM, INFDES, INRCOD, INRC01,
 INRC02, INRC03, INRC04, INRC05, INRC06, INRC07, INRC08, INRC09,
 INRC10, INRV01, INRV02, INRV03, INRV04, INRV05, INRV06, INRV07,
 INRV08, INRV09, INRV10, INDELD, INCUID, INIREF, INSOUR, INSNUM)
 AS RN, f1.*, rrn(f1) RW                                            
 FROM   XRDK/ENAUDFP_RK f1) AS A                                   
 WHERE A.RN in('2', '4', '6', '8', '10', '12')
 )

答案 1 :(得分:0)

如果您可以识别重复项,则可以删除它们。我的例子用表“e2”

显示它
delete from (
  select * from (
      select rownumber() over (partition by .....) as rn,
             e2.* 
        from e2)
   where  mod(rn, 2) = 0 )

我的示例中的mod用于标识每一行。 你已经用rownumber()的想法在正确的轨道上开始了。