Oracle CONNECT BY - retornando apenas item de primeiro nível
-
13-12-2019 - |
Pergunta
Estou tentando selecionar um produto pai e todos os seus produtos filhos;explodir a lista de materiais (BoM), se desejar.Esta deveria ser uma tarefa bastante simples, mas não estou obtendo o resultado esperado.
SELECT LEVEL,
serial_no,
part_no
FROM ifsapp.part_serial_catalog_tab
START WITH serial_no = 'Serial1'
AND part_no = 'ParentPart'
CONNECT BY PRIOR serial_no = superior_serial_no
AND part_no = superior_part_no;
Eu esperaria ver os seguintes resultados:
1 Serial1 ParentPart
2 Serial1 ChildPart1
2 Serial2 ChildPart2
..no entanto, estou recebendo apenas a primeira linha (pai) retornada.
OBSERVAÇÃO:A tabela tem uma chave composta de número_de_peça/número_de_série e, como você pode ver neste exemplo, o pai geralmente herda o número_de_série de um dos filhos.Não tenho certeza de que qualquer uma dessas questões deva complicar muito as coisas, mas é evidente que algo está errado.
Por que minha consulta não está detalhando toda a hierarquia?
Solução
Um colega me ajudou na solução:
SELECT LEVEL,
serial_no,
part_no
FROM ifsapp.part_serial_catalog_tab
START WITH serial_no = 'Serial1'
AND part_no = 'ParentPart'
CONNECT BY PRIOR serial_no = superior_serial_no
AND PRIOR part_no = superior_part_no;
Todos os exemplos que vi referem-se a tabelas com chave simples.Com uma chave composta como esta, sim, preciso especificar um relacionamento entre as duas colunas, mas também preciso da segunda palavra-chave PRIOR:
CONNECT BY PRIOR serial_no = superior_serial_no
AND PRIOR part_no = superior_part_no;
Meu SQL estava sintaticamente correto, mas não para a consulta que pensei estar executando!
Outras dicas
Meu palpite é que isso restringe o resultado apenas ao primeiro registro.
AND part_no = 'ParentPart'