Pergunta

A tabela - consulta possui 2 colunas (functionId, depfunctionId)

Eu quero todos os valores que estão no functionID ou no depfunctionId

Estou usando isso:

select distinct depfunctionid from Query
union 
select distinct functionid from Query

Como fazer isso melhor?

Foi útil?

Solução

Eu acho que é o melhor que você receberá.

Outras dicas

Isso é tão bom quanto é eu acho ...

Perca as cláusulas distintas, como sua união (vs união tudo) cuidará de remover duplicatas.

Uma alternativa - mas talvez menos clara e provavelmente com o mesmo plano de execução - seria fazer uma junção completa nas duas colunas.

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

Tenho quase certeza de que você pode perder os distintos. Quando você usa a união em vez de união, os resultados duplicados são jogados fora.

Tudo depende de quão pesado é sua consulta em linha embutida. A chave para um melhor desempenho seria executar apenas uma vez, mas isso não é possível, dado os dados que ele retorna.

Se você fizer assim:

select depfunctionid , functionid from Query
group by depfunctionid , functionid

É muito provável que você obtenha resultados repetidos para depfunctionID ou functionID.

Posso estar errado, mas parece -me que você está tentando recuperar uma árvore de dependências. Se for esse o caso, eu pessoalmente tentaria usar uma abordagem de caminho materializado.

Se o caminho materializado for armazenado em um nome de tabela auto -referenciante, eu recuperaria a árvore 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

Isso recuperaria toda a árvore na ordem adequada. O que é péssimo é ter que construir o caminho materializado com base no function_id e parent_function_id (ou no seu caso, functionId e depfunctionID), mas um gatilho pode cuidar dele com bastante facilidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top