テーブル - クエリには 2 つの列 (functionId、depFunctionId) があります。
functionid または depfunctionid のいずれかにあるすべての値が必要です
私はこれを使用しています:
select distinct depfunctionid from Query
union
select distinct functionid from Query
それをより良くする方法は?
テーブル - クエリには 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 を使用すると、重複した結果は破棄されます。
それはすべて、インライン ビュー クエリがどれだけ重いかによって異なります。パフォーマンスを向上させるための鍵は、一度だけ実行することですが、返されるデータを考えると、それは不可能です。
このようにすると:
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) に基づいて具体化されたパスを構築する必要がありますが、トリガーはそれを非常に簡単に処理できます。