Siempre trato de poner las expresiones en JOIN
's en el siguiente orden:
joined.column = leading.column
Esta consulta:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
puede tratarse como "para cada transacción, busque el nombre de la dimensión correspondiente" o "para cada dimensión, busque todos los valores de transacción correspondientes".
Entonces, si busco una transacción dada, pongo las expresiones en el siguiente orden:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
, y si busco una dimensión, entonces:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Lo más probable es que la consulta anterior utilice exploraciones de índice primero en (t.id)
, luego en (d.id
), mientras que el último usará exploraciones de índice primero en (d.id)
, luego en (t.dimension)
, y puede verlo fácilmente en la consulta misma:los campos buscados están a la izquierda.
Las tablas conductoras y conducidas pueden no ser tan obvias en un JOIN
, pero es tan claro como una campana para un CONNECT BY
consulta:el PRIOR
fila está conduciendo, el no PRIOR
es conducido.
Por eso esta consulta:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
significa "buscar todas las filas cuyo parent
es un id
dado ". Esta consulta crea una jerarquía.
Esto se puede tratar así:
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);
}
}
Y esta consulta:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
significa "encontrar las filas cuyo id
es un parent
dado ". Esta consulta crea una cadena de ascendencia.
Siempre ponga PRIOR
en la parte derecha de la expresión.
Piense en la PRIOR column
a partir de una constante se buscarán todas sus filas.