2015-12-06 59 views
1

我在Oracle(12c)中有一個表,我需要檢索數據。
該表稱爲ACCOUNT_ANALYSIS_FY16。該表格包含3級業務層次結構。該層級中的位置由DUNS_LEVEL列指定,其值爲DUNS(意味着業務的最低級別),IMMEDIATE(意味着級別2,也稱爲DUNS級別的父級)或ULTIMATE(意味着級別3或父級即時)。如何遍歷Oracle中的表SQL

Applicable columns are: 
NN_NAME - Account Name 
DUNS_LEVEL 
DUNS 
ULTIMATE_PARENT_DUNS 
IMMEDIATE_PARENT_DUNS 

要求......對於一個給定的帳戶名(也有可能是多次出現在同一帳戶名因不同的位置),我需要看到該帳戶的一切(又名SELECT *),AS以及給定賬戶的直接父母和終極父母的一切。

我已經在SQL中編寫了它,但它涉及5個SELECT語句。我知道必須有一個更優雅和簡單的方法來做到這一點。請注意,最終結果是將其放置在匿名PL/SQL塊中,因此如果這是更好的解決方案,編寫PL/SQL塊是可以接受的。

這裏是直接的SQL,我有哪些工作?

Select *from ACCOUNT_ANALYSIS_FY16 where NN_NAME = 'XYZ GROUP' 
union 
Select * from ACCOUNT_ANALYSIS_FY16 where DUNS in (Select IMMEDIATE_PARENT_DUNS from ACCOUNT_ANALYSIS_FY16 where NN_NAME = 'XYZ GROUP') 
union 
Select * from ACCOUNT_ANALYSIS_FY16 where DUNS in (Select ULTIMATE_PARENT_DUNS from ACCOUNT_ANALYSIS_FY16 where NN_NAME = 'XYZ GROUP') 

感謝

+0

你可以做到這一點作爲一個分層查詢不是真正確保結構的數據,所以你可能不得不玩弄它,但像從account_analysis_fy16 a 01選擇a。*,level,sys_connect_by_path(nm_name,'/')「路徑」以ultimate_parent_duns開頭爲空並且nm_name ='XYZ組' 由以前的連接immediate_parent_duns = ultimate_parent_duns或​​之前的duns = immediate_parent_duns; –

+0

坦率地說,我喜歡原始的SQL。很明顯它在做什麼,它很容易閱讀。除非有性能問題,否則我認爲沒有理由改變它。 –

回答

1

嘗試:

SELECT * 
FROM ACCOUNT_ANALYSIS_FY16 t 
WHERE NN_NAME = 'XYZ GROUP' 
    OR EXISTS (
    SELECT NULL 
    from ACCOUNT_ANALYSIS_FY16 t1 
    WHERE t.DUNS IN (t1.ULTIMATE_PARENT_DUNS, t1.IMMEDIATE_PARENT_DUNS) 
     AND t1.NN_NAME = 'XYZ GROUP' 
) 
+0

一旦我添加了合適的索引,這就完全符合我的需求。 – user1009073