比较和显示sqlplus中同一表中的值

时间:2019-11-27 07:46:29

标签: sql oracle

我是sqlplus的新手,对此主题的知识非常有限,有人可以在这方面帮助我吗?

我有一个表,其中包含列:代码,值和日期

在代码列中有两种类型的值,例如:ABC.1和DEF.1。这里DEF.1具有所有日期的值,但ABC.1却不是这样,它缺少某些日期的值。我正在尝试编写查询以提取数据,如果DEF.1中有特定日期的值,而ABC.1中没有该日期的值。

例如:

+------------------------------+
| Code    Value     Date       |
+------------------------------+
| DEF.1    44       22-11-2019 |
+------------------------------+
| ABC.1    23       23-11-2019 |
+------------------------------+
| DEF.1    12       23-11-2019 |
+------------------------------+
| ABC.1    99       24-11-2019 |
+------------------------------+
| DEF.1    23       24-11-2019 |
+------------------------------+

此处ABC.1没有日期为22-11-2019的值,因此对于该日期,我想提取DEF.1的值

2 个答案:

答案 0 :(得分:1)

最简单而且可能最快的是分析count

select code, value, date_
  from (
    select code, value, date_, 
           count(case code when 'ABC.1' then 1 end) over (partition by date_) c1,
           count(case code when 'DEF.1' then 1 end) over (partition by date_) c2
      from tbl t)
  where c1 <> c2

dbfiddle demo

您还可以使用not existsnot in进行分组,但是如果您想了解详细信息,则分析方法最短。该查询显示count不同的所有行,因此,如果有3 ABC和5 DEF,则该日期将获得8行。如果缺少行,它也可以工作,例如您的示例。 Date是保留字,所以我加了下划线。

答案 1 :(得分:0)

我将使用not exists处理这个问题:

select t.*
from t
where t.code = 'DEF.1' and
      not exists (select 1
                  from t t2
                  where t2.date = t.date and t2.code = 'ABC.1'
                 );

使用(date, code)上的索引,我希望它具有非常好的性能。