2009-01-01 7 views
1

La table - Interrogation dispose de 2 colonnes (functionId, depFunctionId)Comment simplifier cette requête Sql

Je veux toutes les valeurs qui sont soit en functionId ou depfunctionid

J'utilise ceci:

select distinct depfunctionid from Query 
union 
select distinct functionid from Query 

Comment le faire mieux?

Répondre

6

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

3

Cest aussi bon qu'il obtient je pense ...

0

Je suis presque sûr que vous pouvez perdre les années distinctes. Lorsque vous utilisez UNION au lieu de UNION ALL, les résultats dupliqués sont rejetés.

Tout dépend de la lourdeur de votre requête de vue en ligne. La clé pour une meilleure performance serait de ne s'exécuter qu'une seule fois, mais ce n'est pas possible étant donné les données qu'elle retourne.

Si vous le faites comme ceci:

select depfunctionid , functionid from Query 
group by depfunctionid , functionid 

Il est très probable que vous aurez répétiez résultats pour depfunctionid ou functionId.

Je peux me tromper, mais il me semble que vous essayez de récupérer un arbre de dépendances. Si c'est le cas, personnellement, j'essaierais d'utiliser une approche matérialisée.

Si le chemin matérialisé est stocké dans un nom de table de référence de l'auto, je récupérer l'arbre 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 récupéré tout l'arbre dans le bon ordre. Ce qui est nul, c'est d'avoir à construire le chemin matérialisé basé sur le function_id et le parent_function_id (ou dans votre cas, functionid et depfunctionid), mais un déclencheur pourrait s'en occuper assez facilement.

+0

Le point concernant les mots-clés DISTINCT est bon. Le reste, je le crains, manque le point. La dernière requête ne sera pas compilée - le function_id de la liste select est ambigu. –

+0

merci de signaler l'erreur. Je ne suis pas en face d'une console de base de données. –

2

Perdez les clauses DISTINCT, car votre UNION (vs UNION ALL) prendra soin de supprimer les doublons.

Une alternative - mais peut-être moins claire et probablement avec le même plan d'exécution - serait de faire une FULL JOIN 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 
Questions connexes