Pregunta

La tabla - Consulta tiene 2 columnas (functionId, depFunctionId)

Quiero todos los valores que estén en functionid o en depfunctionid

Estoy usando esto:

select distinct depfunctionid from Query
union 
select distinct functionid from Query

¿Cómo hacerlo mejor?

¿Fue útil?

Solución

Creo que eso es lo mejor que obtendrás.

Otros consejos

Eso es lo mejor que puedo, creo ...

Pierda las cláusulas DISTINCT, ya que su UNION (vs UNION ALL) se encargará de eliminar los duplicados.

Una alternativa, pero tal vez menos clara y probablemente con el mismo plan de ejecución, sería realizar una UNIÓN COMPLETA en las 2 columnas.

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

Estoy casi seguro de que puedes perder los distintos. Cuando usa UNION en lugar de UNION ALL, los resultados duplicados se desechan.

Todo depende de qué tan pesada sea su consulta de vista en línea. La clave para un mejor rendimiento sería ejecutar solo una vez, pero eso no es posible dados los datos que devuelve.

Si lo haces así:

select depfunctionid , functionid from Query
group by depfunctionid , functionid

Es muy probable que obtenga resultados repetidos para depfunctionid o functionid.

Puede que me equivoque, pero me parece que estás intentando recuperar un árbol de dependencias. Si ese es el caso, personalmente intentaría utilizar un enfoque de ruta materializada.

Si la ruta materializada se almacena en un nombre de tabla de autorreferencia, recuperaría el árbol usando algo como

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

Esto recuperaría todo el árbol en el orden correcto. Lo que apesta es tener que construir la ruta materializada en función de function_id y parent_function_id (o en su caso, functionid y depfunctionid), pero un activador podría encargarse de ello con bastante facilidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top