質問

テーブル-クエリには2つの列(functionId、depFunctionId)があります

functionidまたはdepfunctionidのいずれかにあるすべての値が必要です

これを使用しています:

select distinct depfunctionid from Query
union 
select distinct functionid from Query

それを改善する方法

役に立ちましたか?

解決

これが最高だと思います。

他のヒント

それは私が思うほど良い...

UNION(vs UNION ALL)が重複の削除を処理するため、DISTINCT句を失います。

別の方法-おそらくそれほど明確ではなく、おそらく同じ実行計画で-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

私はあなたが明確なものを失うことができるとほぼ確信しています。 UNION ALLの代わりにUNIONを使用すると、重複した結果は破棄されます。

すべては、インラインビュークエリの負荷に依存します。パフォーマンスを向上させるための鍵は1回だけ実行することですが、返されるデータを考えると不可能です。

このようにする場合:

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)に基づいてマテリアライズドパスを構築する必要があることですが、トリガーで簡単に処理できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top