Preciso acumular dados em uma consulta hierárquica como esta:
select
id,
prior id as parent_id,
count * prior count --need to be accumulated through whole hierarchy like sys_connect_by_path
from table
start with id = 1
connect by prior id = parent_id
Exceto que eu só posso acessar a linha anterior, então não vai funcionar corretamente. E eu não posso usar o alias definido na SELECT
cláusula atual para a linha anterior:
select
id,
prior id as parent_id,
count,
(count * prior whole_count) as count_product --not allowed to do this :(
from table
start with id = 1
connect by prior id = parent_id
O que estou esquecendo? SYS_CONNECT_BY_PATH
fazer exatamente o que preciso (exceto concatenação em vez de multiplicação), então deve ser possível. Posso fazer isso usando WITH
cláusula, mas por algum motivo é extremamente lento, tipo meio segundo para CONNECT_BY
vs ~20 para WITH
.
Saída esperada:
EU IA | ID_PARENTE | CONTAR | CONTAGEM_PRODUTO |
---|---|---|---|
1 | nulo | 1 | 1 |
2 | 1 | 2 | 2 |
3 | 2 | 3 | 6 |
4 | 3 | 4 | 24 |
5 | 4 | 5 | 120 |
6 | 5 | 6 | 720 |
Se você estiver tentando obter o produto de
count
valores sucessivos por meio da hierarquia, use uma cláusula de fatoração de subconsulta recursiva:O que, para os dados da amostra:
Saídas:
violino
Supondo que seus dados sejam uma estrutura de árvore (sem loops) e que haja um único caminho de cada elemento descendente de volta à raiz da árvore, você pode descer a árvore usando uma consulta hierárquica e, então, encontrar todos os valores anteriores usando uma consulta hierárquica correlacionada na direção reversa e agregar seus logaritmos naturais para calcular o produto:
O que, para os dados da amostra:
Saídas:
violino
Não que eu ache isso particularmente inteligente, mas se você insiste em usar CONNECT BY e SYS_CONNECT_BY_PATH: