Domanda

La tabella - La query ha 2 colonne (functionId, depFunctionId)

Voglio tutti i valori che sono sia in functionid che in depfunctionid

Sto usando questo:

select distinct depfunctionid from Query
union 
select distinct functionid from Query

Come farlo meglio?

È stato utile?

Soluzione

Penso che sia il migliore che otterrai.

Altri suggerimenti

Penso che sia bello, penso ...

Perdi le clausole DISTINCT, poiché UNION (vs UNION ALL) si occuperà di rimuovere i duplicati.

Un'alternativa - ma forse meno chiara e probabilmente con lo stesso piano di esecuzione - sarebbe quella di un UNITO COMPLETO attraverso le 2 colonne.

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

Sono quasi sicuro che puoi perdere i distinti. Quando si utilizza UNION anziché UNION ALL, i risultati duplicati vengono eliminati.

Tutto dipende da quanto è pesante la query della vista inline. La chiave per una migliore performance sarebbe quella di eseguire una sola volta, ma ciò non è possibile dati i dati che restituisce.

Se lo fai in questo modo:

select depfunctionid , functionid from Query
group by depfunctionid , functionid

È molto probabile che otterrai risultati ripetuti per depfunctionid o functionid.

Potrei sbagliarmi, ma mi sembra che tu stia cercando di recuperare un albero di dipendenze. In tal caso, personalmente proverei a utilizzare un approccio basato sul percorso materializzato.

Se il percorso materializzato è memorizzato in un nome di tabella autoreferenziale, recupererei l'albero usando qualcosa come

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

Questo avrebbe recuperato l'intero albero nell'ordine corretto. Quello che fa schifo è dover costruire il percorso materializzato basato su function_id e parent_function_id (o nel tuo caso, functionid e depfunctionid), ma un trigger potrebbe occuparsene abbastanza facilmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top