1

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

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

私はこれを使用しています:

select distinct depfunctionid from Query
union 
select distinct functionid from Query

それをより良くする方法は?

4

4 に答える 4

6

それがあなたにとって最高だと思います。

于 2009-01-01T17:20:26.297 に答える
3

それは私が思うほど良いことです...

于 2009-01-01T17:22:29.443 に答える
2

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
于 2009-01-01T20:48:58.857 に答える
0

私はあなたが個別のものを失うことができるとほぼ確信しています。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) に基づいて具体化されたパスを構築する必要がありますが、トリガーはそれを非常に簡単に処理できます。

于 2009-01-01T19:30:02.837 に答える