【问题标题】:Delete duplicate records where column value may null删除列值可能为空的重复记录
【发布时间】:2012-08-27 08:37:38
【问题描述】:

我的表允许有两列 (CAGE,HCC) 空值。我想在我的程序中显示重复的记录,我是这样写的。

 FOR REC IN (SELECT LOCATION, NIIN, INVL_DATE, CAGE, 
          HCC,SUM(CA_QTY) AS SUM_CA,SUM(COST_QTY) AS  SUM_COST,COUNT(*) FROM INVENTORY 
          GROUP BY LOCATION, NIIN, INVL_DATE,
          CAGE, HCC 
          HAVING COUNT(*)>1)
 LOOP  
  VAR_LOC_NAME    :=  REC.LOCATION;
  VAR_NIIN        :=  REC.NIIN;
  VAR_DATE        :=  REC.INVL_DATE;
  VAR_CAGE        :=  REC.CAGE; 
  VAR_HCC         :=  REC.HCC;
  VAR_CA_QTY      :=  REC.SUM_CA;
  VAR_COST_QTY    :=  REC.SUM_COST;

 FOR REC1 IN (SELECT SNO FROM INVENTORY WHERE LOCATION=VAR_LOC_NAME AND  
                NIIN=VAR_NIIN AND TUNC(INVL_DATE)=TRUNC(TO_DATE(VAR_DATE,'DD-MM-YY'))  AND
                CAGE=VAR_CAGE AND HCC=VAR_HCC)
    LOOP
        DBMS_OUTPUT.PUT_LINE('GET NUMBER '||REC1.SNO);
    END LOOP;
   end loop;

但对于 CAGE 和 HCC 的 null 值,它不起作用。 仅供参考:我正在使用 oracle 11g

【问题讨论】:

  • 是否有任何值可以代替 NULL(我的意思是 CAGEHCC 中没有行包含的某个值)?

标签: oracle oracle11g


【解决方案1】:

您需要找到一些未在CAGEHCC 列中使用的值,并使用Oracle 的NVL 函数将NULL 值替换为该唯一值。所以:

 FOR REC IN (SELECT LOCATION, NIIN, INVL_DATE, NVL(CAGE,-1) as CAGE, 
          NVL(HCC,-1) as HCC,SUM(CA_QTY) AS SUM_CA,SUM(COST_QTY) AS  SUM_COST,COUNT(*) FROM INVENTORY 
          GROUP BY LOCATION, NIIN, INVL_DATE,
          NVL(CAGE,-1), NVL(HCC,-1) 
          HAVING COUNT(*)>1)

当然-1在这里只是一个示例。

至于第二个循环:

FOR REC1 IN (SELECT SNO FROM INVENTORY WHERE LOCATION=VAR_LOC_NAME AND  
            NIIN=VAR_NIIN AND TUNC(INVL_DATE)=TRUNC(TO_DATE(VAR_DATE,'DD-MM-YY'))  AND
            NVL(CAGE,-1)=VAR_CAGE AND NVL(HCC,-1)=VAR_HCC)

在打印输出时,您可以将 -1 替换为 NULL

【讨论】:

  • 感谢您对我的帮助。我用适当的值替换了 -1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多