Comment simplifier cette requête SQL
-
03-07-2019 - |
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?
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.