我有一个将数据写入数据库的应用程序。如果某些记录有误,然后用户修改了一些新数据,它将添加一个新行,该行将处理状态显示为“刷新”。
我该如何编写一个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 |
+------+---------+-------------+
答案 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
最多有两个特定选项(即Refresh
和ProcessStatus
)
只需将以下内容与in
运算符
select *
from tab
where ( ProcessID, ProcessStatus ) in
(
select ProcessID, max(ProcessStatus)
from tab
group by ProcessID
)
order by row_id;