当ID具有必须满足的多行条件时,返回ID

时间:2019-11-21 20:31:51

标签: sql oracle

我正在尝试编写一个查询,该查询使用同一列的不同值从多行返回满足条件的ID。例如

>>conversion = colorsys.rgb_to_hsv(RC, GC, BC)
>>print(conversion)
>>#outputted data
>>(H,S,L)

我希望创建并激活的订单都成功。因此,返回行将为1。如果ID 2对于actiavte和create都成功,则返回将均为1和2。

我尝试过

ID | EVENT  | STATUS
---------------------
1  | Create  | Success
1  | Activate | Success
2  | Create  | Success
2  | Activate | In Progress

但我认为语法不正确。

谢谢

7 个答案:

答案 0 :(得分:2)

这就是您想要的:

select ID, EVENT, STATUS
from EOMSCHEMA.AUDIT_RECORDS
where event = 'Activate' and status = 'Completed'
and ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE event = 'Create' and status= 'Completed')

答案 1 :(得分:2)

我个人会发现这样的内容最容易阅读和理解(给我第一个查询中的所有内容,也提供给第二个查询中的所有内容)

select id
  from audit_records
 where event = 'Activate'
   and status = 'Completed'
intersect
select id
  from audit_records
 where event = 'Create'
   and status = 'Completed'

但这可能不是编写查询的最有效方法。像

select id
  from audit_records
 where status = 'Completed'
   and event in ('Activate', 'Create')
 group by id
having count(distinct event) = 2

可能更有效。但这可能不是立即显而易见的。从逻辑上讲,它将获取status为“已完成”且event为“激活”或“创建”的所有行。这样,两行都位于id = 1处,而第一行只有id = 2处。然后,它按id进行汇总,并计算有多少个不同的event值。 id = 1具有两个不同的event值(“激活”和“创建”),因此将其返回。 id = 2只有一个不同的event,因此将其删除。

如果您编写的查询偶尔需要运行并且数据量不太大,那么我建议使用intersect方法来最大化程序员的理解力。如果您在代码的性能至关重要的部分中执行此操作,则可能需要group by加上一些注释来说明其功能。

答案 2 :(得分:0)

如果要返回表的所有列,则可以使用EXISTS两次:

select t.ID, t.EVENT, t.STATUS
from EOMSCHEMA.AUDIT_RECORDS as t
where 
  exists (select 1 from EOMSCHEMA.AUDIT_RECORDS where ID = t.ID and event = 'Activate' and status = 'Completed')
  and
  exists (select 1 from EOMSCHEMA.AUDIT_RECORDS where ID = t.ID and event = 'Create' and status= 'Completed')

答案 3 :(得分:0)

您可以通过以下几种方法执行此操作:

select ID, EVENT, STATUS 
FROM EOMSCHEMA.AUDIT_RECORDS
WHERE ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE EVENT = 'CREATE' AND STATUS = 'SUCCESS')
AND ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE EVENT = 'ACTIVATE' AND STATUS= 'SUCCESS');

此方法使用一系列子查询来确保满足所有条件,并将拉回与通过检查的ID相关联的所有行。

答案 4 :(得分:0)

根据记录的数量,这可能会比较慢,但是应该可以为您找到所需的内容。

您未指定sql版本。这是MSSQL,因此您可能需要进行一些细微调整。

SELECT 
COMPLETED.ID, 
COMPLETED.EVENT, 
COMPLETED.STATUS AS CompletedStatus, 
CREATED.STATUS as CreatedStatus

FROM

(SELECT ID, EVENT, STATUS
from EOMSCHEMA.AUDIT_RECORDS
where (event = 'Activate' and status = 'Completed') ) AS COMPLETED

INNER JOIN

(SELECT ID, EVENT, STATUS
from EOMSCHEMA.AUDIT_RECORDS
where (event = 'CREATE' and status = 'Completed') ) AS CREATED

on COMPLETED.ID = CREATED.ID

答案 5 :(得分:0)

select id from records where eventlog='activate' and 
statuslog='success' and  id in (select id from test where 
eventlog='create' and statuslog ='success');

答案 6 :(得分:0)

类似的事情。

select * from audit_records 
where id in (select id 
             from audit_records  
             group by id 
             having avg(case when status = 'Success' then 1 else 0 end) = 1);
相关问题