oracle查询根据条件删除重复行

Posted

技术标签:

【中文标题】oracle查询根据条件删除重复行【英文标题】:oracle query to remove duplicate rows based on condition 【发布时间】:2015-08-09 08:51:42 【问题描述】:

我有下表所示的数据。

+------+----------+----------+
| type |  date1   |  date2   |
+------+----------+----------+
| IT1  | 05/01/15 | 08/01/15 |
| IT1  | 05/01/15 |          |
| IT1  | 04/01/15 |          |
| IT1  |          | 03/02/15 |
| IT1  | 06/01/15 | 03/02/15 |
| IT1  |          | 04/02/15 |
| IT2  | 05/01/15 |          |
| IT2  | 05/01/15 | 04/01/15 |
| IT2  | 03/01/15 |          |
| IT2  |          | 09/01/15 |
+------+----------+----------+

我需要通过删除重复来获取行,结果如下

+------+----------+----------+
| type |  date1   |  date2   |
+------+----------+----------+
| IT1  | 05/01/15 | 08/01/15 |
| IT1  | 04/01/15 |          |
| IT1  | 06/01/15 | 03/02/15 |
| IT1  |          | 04/02/15 |
| IT2  | 05/01/15 | 04/01/15 |
| IT2  | 03/01/15 |          |
| IT2  |          | 09/01/15 |
+------+----------+----------+    

对于特定类型,

    如果 date1 存在对应的 date2,则选择该行并删除其他 date1 如果对应的 date2 不存在,则保留它

同样,

    如果 date2 存在对应的 date1,则选择该行并删除其他 date2 如果对应的 date1 不存在,则保留它

是否可以为此编写一个 oracle 查询? 谁能帮我做这件事?

【问题讨论】:

【参考方案1】:

试试这个查询:

select *
from table1 t1
WHERE
  "date2" IS NOT NULL
  AND
  "date1" IS NOT NULL
  OR
  "date2" IS NULL 
  AND NOT EXISTS (
    SELECT 1 FROM table1 t2
    WHERE t1."type" = t2."type"
      AND t1."date1" = t2."date1"
      AND t2."date2" IS NOT NULL
   )
   OR
  "date1" IS NULL 
  AND NOT EXISTS(
    SELECT 1 FROM table1 t2
    WHERE t1."type" = t2."type"
      AND t1."date2" = t2."date2"
      AND t2."date1" IS NOT NULL
   )  

演示:http://sqlfiddle.com/#!4/12b8b/8

【讨论】:

以上是关于oracle查询根据条件删除重复行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle根据总和从查询集中删除行

Oracle查询及删除重复数据

Oracle 查询并删除重复记录的SQL语句

笔记:Oracle查询重复数据并删除,只保留一条记录

oracle数据查询时如何定位问题数据

ORACLE中的distinct消除重复行,我用where链接了多个表 查询了多个字段