2009-01-01 89 views
1

表 - 查詢有2列(functionId,depFunctionId)如何簡化這個SQL查詢

我想這是無論是在functionid或depfunctionid

我用這所有的值:

select distinct depfunctionid from Query 
union 
select distinct functionid from Query 

如何做得更好?

回答

6

我認爲這是最好的你會得到。

3

這就像它得到我認爲...

0

我幾乎可以肯定,你可以放棄獨特的。 當您使用UNION而不是UNION ALL時,重複的結果將被丟棄。

這一切都取決於你的內聯視圖查詢的重要程度。獲得更好性能的關鍵是隻執行一次,但考慮到它返回的數據,這是不可能的。

如果你不喜歡這樣寫道:

select depfunctionid , functionid from Query 
group by depfunctionid , functionid 

很可能你會得到重複depfunctionid或functionid結果。

我可能是錯的,但在我看來,你試圖檢索一個依賴關係樹。如果是這種情況,我個人會嘗試使用物化路徑方法。

如果物化路徑存儲在一個自我引用的表名,我將檢索使用的東西樹像

select asrt2.function_id 
from a_self_referencig_table asrt1, 
     a_self_referencig_table asrt2 
where asrt1.function_name = 'blah function' 
and asrt2.materialized_path like (asrt1.materialized_path || '%') 
order by asrt2.materialized_path, asrt2.some_child_node_ordering_column 

這將檢索整個樹按正確的順序。什麼是必須基於function_id和parent_function_id構建物化路徑(或者在你的情況下,functionid和depfunctionid),但觸發器可以很容易地處理它。

+0

有關DISTINCT關鍵字的觀點很好。我擔心的其餘部分沒有提到。最後一個查詢不會編譯 - 選擇列表中的function_id不明確。 – 2009-01-01 19:49:47

2

丟失DISTINCT子句,因爲您的UNION(vs UNION ALL)將負責刪除重複項。

另一種方法 - 但也許不那麼清晰,可能採用相同的執行計劃 - 將在2列中進行FULL JOIN。

SELECT 
    COALESCE(Query1.FunctionId, Query2.DepFunctionId) as FunctionId 
FROM Query as Query1 
FULL OUTER JOIN Query as Query2 ON 
    Query1.FunctionId = Query2.DepFunctionId