2014-04-11 124 views
1

在此工作順序表中有多個工單順序元素。每個元素可以是父列中的父元素或者是子元素。孩子將包含父母wonum。我期待實現的是有一個查詢,如果狀態爲COMP,將選擇父項。如果父元素狀態爲COMP,則還檢索與該父元素關聯的子項。我遇到的最大問題是找到合適的孩子。如果父母沒有狀態COMP,則不管子女狀態如何,都不要將孩子包括在結果集中。查詢特定結果集

工單表

wonum  parent  status  worktype 
=====  ======  ======  ======== 
1000  NULL  COMP  INSP 
1002  1000  COMP  INSP 
1005  1000  COMP  INSP 
1006  NULL  APPR  INSP 
1008  1006  COMP  INSP 
1009  1006  COMP  INSP 
1010  1006  APPR  INSP 
1011  1006  COMP  INSP 

所需的輸出

wonum  parent  status  worktype 
=====  ======  ======  ======== 
1000  NULL  COMP  INSP 
1002  1000  COMP  INSP 
1005  1000  COMP  INSP 

通過該小樣本數據。我有兩個父母(1000和1006)。 1006仍然有APPR狀態的子元素。我想查詢與父母關聯的父母和子女。所有的狀態COMP。

+0

這是否走得更深兩個級別(即比父母更多+兒童)?是否會有一個價值1002的父母呢? –

+0

它將永遠是父母的子女關係。所以它最多會下降兩個級別。 –

回答

1

我很驚訝這並沒有得到太多的回答。從聽起來,我會做所有工作訂單的預查詢,其中父母爲空且狀態爲「COMP」。從這個角度來說,你有最高的工單。然後搶工單的所有兒童

select 
     yt2.* 
    from 
     (select yt.wonum 
      from YourTable yt 
      where parent is null 
      and status = 'COMP') PQ 
     JOIN YourTable yt2 
     on PQ.wonum = yt2.wonum 
     OR PQ.wonum = yt2.parent 
    order by 
     coalesce(yt2.parent, yt2.wonum), 
     case when yt2.parent is null 
      then 1 else 2 end 

因此,內部預查詢會捕捉到你的工作訂單1000作爲頂級父爲null,並且狀態爲「COMP」。然後根據工資單編號或父母匹配的預認證工單號再次直接返回到表格。這將爲您提供任何合格的完成工單的所有行。

現在,爲了保持相關的工作訂單在一起,我們按順序排列。訂單的第一部分通過使用COALESCE()來表示......如果第一個參數爲空,則使用第二個參數。因此,對於null的「父」記錄,它將獲取工作訂單值1000.對於具有父值的子條目,它將獲取它們的1000個父值。所以,現在你們每個家長都有各自的工作單。

最後,通過第二部分的順序。我正在做一個案子/在這裏。如果父ID值爲空,那麼這是整個訂單的第一個條目。把IT放在第一位,然後是其他任何事情。

如需幫助優化查詢,確保你的表有 (父,狀態)的指數 和(wonum,母體)的額外指標

+0

是的,很簡單。但目前還不清楚它是否是一個未知深度的層次結構,或者是一個簡單的親子關係。 –

+0

這很好解釋。謝謝。還有一個問題我正在研究,看看它是否也適用於Oracle和DB2數據庫。我不認爲它至少會碰到Oracle的衝突。 –

+0

@DerekParker,我不希望在Oracle中看到任何問題,但從未使用過DB2。 – DRapp