Oracle
 sql >> Database >  >> RDS >> Oracle

Come faccio a ricordare in che direzione dovrebbe andare PRIOR nelle query CONNECT BY

Cerco sempre di inserire le espressioni in JOIN è nel seguente ordine:

joined.column = leading.column

Questa domanda:

SELECT  t.value, d.name
FROM    transactions t
JOIN
        dimensions d
ON      d.id = t.dimension

può essere trattato come "per ogni transazione, trova il nome della dimensione corrispondente" o "per ogni dimensione, trova tutti i valori di transazione corrispondenti".

Quindi, se cerco una determinata transazione, metto le espressioni nel seguente ordine:

SELECT  t.value, d.name
FROM    transactions t
JOIN
        dimensions d
ON      d.id = t.dimension
WHERE   t.id = :myid

e se cerco una dimensione, allora:

SELECT  t.value, d.name
FROM    dimensions d
JOIN
        transactions t
ON      t.dimension = d.id
WHERE   d.id = :otherid

La precedente query molto probabilmente utilizzerà le scansioni dell'indice prima su (t.id) , quindi su (d.id ), mentre quest'ultimo utilizzerà prima le scansioni dell'indice su (d.id) , quindi su (t.dimension) , e puoi vederlo facilmente nella query stessa:i campi cercati sono a sinistra.

Le tabelle guida e guidate potrebbero non essere così ovvie in un JOIN , ma è chiaro come un campanello per un CONNECT BY interrogazione:il PRIOR la riga sta guidando, il non PRIOR è guidato.

Ecco perché questa query:

SELECT  *
FROM    hierarchy
START WITH
        id = :root
CONNECT BY
        parent = PRIOR id

significa "trova tutte le righe il cui parent è un dato id ". Questa query crea una gerarchia.

Questo può essere trattato in questo modo:

connect_by(row) {
  add_to_rowset(row);

  /* parent = PRIOR id */
  /* PRIOR id is an rvalue */
  index_on_parent.searchKey = row->id;

  foreach child_row in index_on_parent.search {
    connect_by(child_row);
  }
}

E questa domanda:

SELECT  *
FROM    hierarchy
START WITH
        id = :leaf
CONNECT BY
        id = PRIOR parent

significa "trova le righe il cui id è un dato parent ". Questa query crea una catena di ascendenza.

Metti sempre PRIOR nella parte destra dell'espressione.

Pensa alla PRIOR column a partire da una costante verranno cercate tutte le tue righe.