Question

La table - La requête comporte 2 colonnes (functionId, depFunctionId)

Je veux toutes les valeurs qui se trouvent dans functionid ou depfunctionid

J'utilise ceci:

select distinct depfunctionid from Query
union 
select distinct functionid from Query

Comment mieux faire?

Était-ce utile?

La solution

Je pense que c'est le meilleur que vous obtiendrez.

Autres conseils

C’est aussi bon que ça, je pense ...

Supprimez les clauses DISTINCT car votre UNION (vs UNION ALL) se chargera de supprimer les doublons.

Une alternative - mais peut-être moins claire et probablement avec le même plan d’exécution - consisterait à faire une jointure complète sur les 2 colonnes.

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

Je suis presque sûr que vous pouvez perdre le distinct. Lorsque vous utilisez UNION au lieu de UNION ALL, les résultats dupliqués sont supprimés.

Tout dépend de la charge de votre requête de vue intégrée. La clé pour une meilleure performance serait de n’exécuter qu’une fois, mais ce n’est pas possible compte tenu des données qu’elle renvoie.

Si vous le faites comme ceci:

select depfunctionid , functionid from Query
group by depfunctionid , functionid

Il est très probable que vous obtiendrez des résultats répétés pour depfunctionid ou functionid.

Je me trompe peut-être, mais il me semble que vous essayez de récupérer un arbre de dépendances. Si tel est le cas, j'essaierais personnellement d'utiliser une approche de chemin matérialisé.

Si le chemin matérialisé est stocké dans un nom de table auto-référençant, je récupérerais l'arborescence en utilisant quelque chose comme

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

Ceci permettrait de récupérer l’arbre entier dans le bon ordre. Ce qui est nul, c’est de devoir construire le chemin matérialisé sur la base des identifiants function_id et parent_function_id (ou, dans votre cas, functionid et depfunctionid), mais un déclencheur pourrait s’en occuper assez facilement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top