sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo recuerdo en qué dirección debe ir PRIOR en las consultas CONECTAR POR?

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.