Come semplificare questa query SQL
-
03-07-2019 - |
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?
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.