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.