Oracle Connect by - restituire solo l'elemento di primo livello
-
13-12-2019 - |
Domanda
Sto cercando di selezionare un prodotto genitore e tutti i suoi prodotti figlio;esplodere la fattura dei materiali (BOM), se lo farai.Questo dovrebbe essere un compito abbastanza semplice, ma non ottengo il risultato atteso.
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;
.
Mi aspetterei di vedere i seguenti risultati:
1 Serial1 ParentPart
2 Serial1 ChildPart1
2 Serial2 ChildPart2
.
.. Tuttavia, sto solo ottenendo la prima riga (genitore) restituito.
Nota: la tabella ha un tasto composito di PART_NO / SERIAL_NO, e come si può vedere da questo esempio, il genitore di solito eredita lo Serial_no da uno dei bambini.Non sono sicuro che nessuno di questi problemi dovrebbe complicare molto le cose, ma chiaramente qualcosa sta sbagliando.
Perché la mia query non è la perforazione attraverso la gerarchia completa?
Soluzione
Un collega mi ha aiutato alla soluzione:
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;
.
Tutti gli esempi che ho visto fare riferimento a tabelle con una semplice chiave.Con un tasto composito come questo, sì, devo specificare una relazione tra entrambe le colonne, ma ho anche bisogno della seconda parola chiave precedente:
CONNECT BY PRIOR serial_no = superior_serial_no
AND PRIOR part_no = superior_part_no;
.
My SQL è stato sintatticamente corretto, ma non per la query ho pensato di essere in esecuzione!
Altri suggerimenti
La mia ipotesi è che ciò limita il risultato solo il primo record.
AND part_no = 'ParentPart'
.