从新行的错误中刷新的条件选择数据

时间:2019-05-08 18:37:35

标签: sql oracle

我有一个将数据写入数据库的应用程序。如果某些记录有误,然后用户修改了一些新数据,它将添加一个新行,该行将处理状态显示为“刷新”。

我该如何编写一个oracle查询来搜索状态“错误”,但是如果某些内容是“刷新”则返回?

如果相同Process_ID状态的状态为“刷新”,则逻辑将选择所有具有“错误”的数据,然后仅选择刷新。

例如,这里是一些看起来像样例的数据,我只想返回第2、4、6和7行

+------+---------+-------------+
|Row_ID|ProcessID|ProcessStatus|
+------+---------+-------------+
|1     |123      |Error        |
|2     |123      |Refresh      | 
|3     |456      |Error        |
|4     |456      |Refresh      | 
|5     |789      |Error        |
|6     |789      |Refresh      | 
|7     |987      |Error        |
+------+---------+-------------+

3 个答案:

答案 0 :(得分:0)

category_id浮现在脑海:

Exists

或者,您可以使用窗口功能:

select t.*
from t
where t.processstatus = 'Refresh' and
      exists (select 1 
              from t t2
              where t2.ProcessID = t.ProcessID and t2.processstatus = 'Error'
             )
union all
select t.*
from t
where t.processstatus = 'Error' and
      not exists (select 1 
                  from t t2
                  where t2.ProcessID = t.ProcessID and t2.processstatus = 'Refresh'
                 );

答案 1 :(得分:0)

如果更大的row_id值表示较新的条目,则只需为每个row_id获取最大的processid,然后加入表:

select t.*
from tablename t inner join (
  select processid, max(row_id) row_id
  from tablename
  group by processid
) g on t.row_id = g.row_id

答案 2 :(得分:0)

如果Error最多有两个特定选项(即RefreshProcessStatus) 只需将以下内容与in运算符

一起使用
select *
  from tab 
 where ( ProcessID, ProcessStatus ) in
  (
   select ProcessID, max(ProcessStatus)
     from tab
    group by ProcessID
  )
 order by row_id;

Demo