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.