2016-02-11 38 views
7

La seguente query mostra che select * combinato con connect by e left join non restituisce tutte le colonne, ma solo le colonne utilizzate in queste condizioni. Questo comportamento è stato utile per me, dal momento che select * non deve essere utilizzato nel rilascio, è utile per richiedere dati.Oracle select asterisco connect by join sql-92 combination

with t1 as (
    select 1 id, 0 parent, 'ROOT' name from dual 
    union all 
    select 2 id, 1 parent, 'CHILD-1' name from dual 
    union all 
    select 3 id, 1 parent, 'CHILD-2' name from dual 
), t2 as (
    select 1 t1id, 'node' special from dual 
) 
    select * from t1 
    left join t2 on t2.t1id=t1.id 
    start with id = 2 
    connect by prior parent = id; 

mentre altre query restituisce tutte le colonne

select * from t1 
    start with id = 2 
    connect by prior parent = id; 

    select * from t1 
    left join t2 on t2.t1id=t1.id; 

non ho potuto trovato documentazione su questa funzionalità, c'è qualche?

+0

'selezionare T1. *, T2. *' Opere.Non ho idea del perché "SELECT *" no. – MT0

+0

e aggiungendo 'WHERE name NON È NULL E '(speciale IS NULL O speciale NON È NULL)' significherà quindi che quelle colonne appaiono in 'SELECT *'. – MT0

risposta

0

Credo che la documentazione che stai cercando può essere trovato qui: Hierarchical Queries

La parte più rilevante:

Oracle elabora query gerarchiche come segue:

  • un join, se presente, viene valutato per primo, se il join è specificato nella clausola FROM o con i predicati della clausola WHERE.

  • Viene valutata la condizione CONNECT BY.

  • Eventuali restanti predicati della clausola WHERE vengono valutati.

Oracle utilizza quindi le informazioni da queste valutazioni per formare la gerarchia che procede come segue:

  1. Oracle seleziona la riga radice (s) della gerarchia - le righe che soddisfano START CON condizione

  2. Oracle seleziona le righe figlio di ogni riga radice. Ogni riga secondaria deve soddisfare la condizione della condizione CONNECT BY rispetto a una delle righe radice.

  3. Oracle seleziona le generazioni successive di righe figlio. Oracle seleziona prima i figli delle righe restituite nel passaggio 2, quindi i figli di quei bambini e così via. Oracle seleziona sempre i bambini valutando la condizione CONNECT BY rispetto a una riga padre corrente.

  4. Se la query contiene una clausola WHERE senza un join, Oracle elimina tutte le righe dalla gerarchia che non soddisfano la condizione della clausola WHERE. Oracle valuta questa condizione per ogni riga singolarmente, anziché rimuovere tutti i figli di una riga che non soddisfano la condizione.

  5. Oracle restituisce le righe nell'ordine mostrato in Figura 9-1. Nel diagramma, i bambini appaiono sotto i loro genitori. Per una spiegazione degli alberi gerarchici, vedere la Figura 3-1, "Albero gerarchico".

0

Non SQL-92, ma realizzare SELECT * + CONNECT BY + LEFT JOIN

WITH t1 AS (
    SELECT 1 ID, 0 PARENT, 'ROOT' NAME FROM dual 
    UNION ALL 
    SELECT 2 ID, 1 PARENT, 'CHILD-1' NAME FROM dual 
    UNION ALL 
    SELECT 3 ID, 1 PARENT, 'CHILD-2' NAME FROM dual 
), t2 AS (
    SELECT 1 t1id, 'node' special FROM dual 
) 
SELECT  * 
FROM  t1, t2 
WHERE t2.t1id(+) = t1.ID 
START WITH ID = 2 
CONNECT BY PRIOR PARENT = ID 
;