具有组的Oracle查询



我有一个场景,需要获取同一源的ID中的所有记录。下面是我的输入记录集

ID  SOURCE  CURR_FLAG       TYPE
1   IBM       Y               P
1   IBM       Y               OF
1   IBM       Y               P
2   IBM       Y               P
2   TCS       Y               P
3   IBM     NULL              P
3   IBM     NULL              P
3   IBM     NULL              P
4   IBM     NULL              OF
4   IBM     NULL              OF
4   IBM      Y                ON

从上面的设置中,我需要选择同一ID组中源为IBM的所有记录。在ID组中,如果至少有一条记录的来源不是IBM,那么我不希望该ID组中有任何记录。此外,我们只需要获取那些在curr_fl='Y'的ID组中至少有一条记录的记录

在上面的场景中,即使ID=3的源为IBM,但没有CURR_FL="Y"的记录,我的查询也不应该获取该值。在ID=4的情况下,它可以获取ID=4中的所有记录,因为其中一条记录的值为"Y"。

同样在满足上述条件的组中,我还需要一个source_type条件。如果存在source_type='P'的记录,那么我只需要获取该记录。如果没有带P的记录,则我将搜索source_type='OF',否则source_type='ON'

我写了一个查询如下。但它运行了很长时间,没有得到任何结果。有没有更好的方法来修改这个查询

select
ID,
SOURCE,
CURR_FL,
TYPE
from TABLE a
where 
not exists(select 1 from TABLE B where a.ID = B.ID and source <> 'IBM')
and exists(select 1 from TABLE C where a.ID = C.ID and CURR_FL = 'Y')  and
(TYPE, ID) IN (
select case  type when 1 then 'P' when 2 then 'OF' else 'ON' END TYPE,ID  from
(select ID,
max(priority) keep (dense_rank first order by priority asc) as type
from ( select ID,TYPE,
case TYPE 
when 'P' then 1
when 'OF' then 2
when 'ON' then 3
end as priority 
from TABLE where ID
in(select ID from TABLE where CURR_FL='Y') AND SOURCE='IBM')
group by ID)) 

我认为您可以通过ID对表进行一次聚合,检查yes标志,并断言没有非IBM源代码出现。我在下面的CTE中这样做,然后连接回您的原始表以返回完全匹配的记录。

WITH cte AS (
SELECT
ID,
CASE WHEN SUM(CASE WHEN TYPE = 'P'  THEN 1 ELSE 0 END) > 0
THEN 1
WHEN SUM(CASE WHEN TYPE = 'OF' THEN 1 ELSE 0 END) > 0
THEN 2
WHEN SUM(CASE WHEN TYPE = 'ON' THEN 1 ELSE 0 END) > 0
THEN 3 ELSE 4 END AS p_type
FROM yourTable
GROUP BY ID
HAVING
SUM(CASE WHEN CURR_FLAG = 'Y' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN SOURCE <> 'IBM' THEN 1 ELSE 0 END) = 0
)
SELECT t1.*
FROM yourTable t1
INNER JOIN cte t2
ON t1.ID = t2.ID
WHERE
t2.p_type = 1 AND t1.TYPE = 'P' OR
t2.p_type = 2 AND t1.TYPE = 'OF' OR
t2.p_type = 3 AND t1.TYPE = 'ON';

相关内容

  • 没有找到相关文章

最新更新