2017-10-13 78 views
1

我有一個場景,我需要獲取同一個來源的ID內的所有記錄。下面給出的是我的輸入記錄集Oracle查詢與組

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記錄group.Within的ID組,如果有至少一個記錄與除IBM之外的其他來源,那麼我不希望來自該ID組的任何記錄。此外,我們只需要提取那些至少有一條記錄位於該組ID中的記錄,其中curr_fl ='Y'

在上述場景中,即使ID = 3的源爲IBM,但沒有記錄CURR_FL ='Y',我的查詢不應該取值。在ID = 4的情況下,它可以取所有ID = 4的記錄,因爲其中一條記錄的值='Y'。

在滿足上述條件的組內,我還需要一個更多的source_type條件。如果有記錄的source_type ='P',那麼我只需要抓取該記錄。如果沒有P記錄,那麼我將搜索source_type ='OF'else 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)) 

回答

0

我覺得你可以做在你的表中的單個聚集通過ID並檢查是標誌以及斷言,沒有出現非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'; 
+0

謝謝。但我還有一個source_type的場景。我可以在這個查詢中包含 – GIN

+0

@GIN答案已更新。 –

+0

非常感謝Tim。爲了澄清我的情況,只有在沒有記錄的情況下,我需要ON記錄,其中source_type ='P'或source_type ='OF'。優先級是P - > OF - > ON。 – GIN