【问题标题】:How can i get the duplicate value in oracle我怎样才能在oracle中获得重复值
【发布时间】:2014-02-19 16:16:32
【问题描述】:

您好,我使用左连接从各种表中选择了以下列,我得到以下结果。

Box_ID    BOX_NAME  VALUE  PROM_EFFDATE       PROM_CLOSEDATE

11      JE 1        115    2/27/2014    
11      JE 2        80     2/27/2014              3/6/2014
11      JE 4        60     2/17/2014    
11      JE 3

如果 PROM_CLOSEDATE 有一些值,那么等效的 BOX_NAME(JE2) 应该再次显示为空值和空 effdate。我们可以为不同的周期时间输入任何其他不同的值。 这是实际的要求。结果应该是:

Box_ID    BOX_NAME  VALUE  PROM_EFFDATE       PROM_CLOSEDATE

    11      JE 1        115    2/27/2014    
    11      JE 2        80     2/27/2014              3/6/2014
    11      JE 2                          
    11      JE 4        60     2/17/2014    
    11      JE 3

这样我必须得到价值。

这里我已经按照san的指导使用了,

SELECT Box_ID,BOX_NAME, VALUE, PROM_EFFDATE, PROM_CLOSEDATE
  FROM tab
UNION
SELECT Box_ID,BOX_NAME, NULL, NULL, NULL 
 FROM tab
WHERE PROM_CLOSEDATE IS NOT NULL
order by 2

但我想要更精确的结果。当我为 JE2(2nd ) Occurance 输入值和生效日期(不提供 CLOSE_DATE)时,我得到以下输出。

Box_ID    BOX_NAME  VALUE  PROM_EFFDATE       PROM_CLOSEDATE

        11      JE 1        115    2/27/2014    
        11      JE 2        80     2/27/2014              3/6/2014
        11      JE 2        90     4/6/2014           
        11      JE 2                          
        11      JE 4        60     2/17/2014    
        11      JE 3

但实际上,当 BOX_NAME(此处为 JE2)有没有 Closedate 的记录时,我不需要具有 NULL 值、NULL 生效日期、NULL closeate 的记录。 我只需要当它有 closeate 的记录时才需要不是 NULL 的情况。即使它有带有值、生效日期和没有关闭日期的记录,也不应该出现空记录。 这是我的要求。请帮我解答。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    最简单的方法是使用 union all

    WITH tab(Box_ID,BOX_NAME, VALUE, PROM_EFFDATE, PROM_CLOSEDATE) AS (
    SELECT 11,'JE 1',115,'2/27/2014', NULL FROM dual UNION ALL   
    SELECT 11,'JE 2', 80,'2/27/2014','3/6/2014' FROM dual UNION ALL
    SELECT 11,'JE 2', 90,'2/28/2014','3/7/2014' FROM dual UNION ALL
    SELECT 11,'JE 4', 60,'2/17/2014', NULL  FROM dual UNION ALL    
    SELECT 11,'JE 3', NULL, NULL, NULL  FROM dual)
    ----------
    --End of data preparation
    ----------
    SELECT Box_ID,BOX_NAME, VALUE, PROM_EFFDATE, PROM_CLOSEDATE
      FROM tab
    UNION
    SELECT Box_ID,BOX_NAME, NULL, NULL, NULL 
     FROM tab
    WHERE PROM_CLOSEDATE IS NOT NULL
    order by 2
    

    输出:

    | BOX_ID | BOX_NAME |  VALUE | PROM_EFFDATE | PROM_CLOSEDATE |
    |--------|----------|--------|--------------|----------------|
    |     11 |     JE 1 |    115 |    2/27/2014 |         (null) |
    |     11 |     JE 2 |     80 |    2/27/2014 |       3/6/2014 |
    |     11 |     JE 2 | (null) |       (null) |         (null) |
    |     11 |     JE 3 | (null) |       (null) |         (null) |
    |     11 |     JE 4 |     60 |    2/17/2014 |         (null) |
    

    【讨论】:

    • 那又怎样?只需在End of data preparation 之后使用选择部分,并将@​​987654324@ 替换为您的表名。它适用于您表中存在的所有记录。
    • 在这种情况下,您可以在第二次选择中使用distinct 作为select distinct Box_ID,BOX_NAME, NULL, NULL, NULL FROM tab 或将union all 替换为union
    • 根据您的要求更新了帖子。
    • 谢谢桑。工会运作良好。在此表中,PROM_EFFDATE 只是必填字段。我们可以在不提供 PROM_CLOSEDATE 的情况下保存。当我们保存记录而不给出 PROM_CLOSEDATE 时,不应添加空值记录。这是我的要求。但是由于我们已经添加了 PROM_CLOSEDATE 值,它添加了空记录。我应该怎么办。你能帮帮我吗??
    【解决方案2】:
    SELECT Box_ID,BOX_NAME, VALUE, PROM_EFFDATE, PROM_CLOSEDATE
      FROM tab
    UNION
    SELECT Box_ID,BOX_NAME, NULL, NULL, NULL 
     FROM tab
    WHERE (PROM_CLOSEDATE IS NOT NULL 
    AND PROM_EFFDATE IS NOT NULL) AND
    (PROM_CLOSEDATE IS NULL 
    AND PROM_EFFDATE IS NOT NULL)
    order by 2
    

    此代码将起作用

    【讨论】:

      猜你喜欢
      • 2011-06-04
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多