2008-11-06 15 views
5

Tengo una memoria terrible. Cada vez que hago una consulta CONNECT BY en Oracle, y me refiero a cada vez, tengo que pensar mucho y, por lo general, a través del método de prueba y error, sobre qué argumento debe ir el PRIOR.¿Cómo recuerdo qué camino debe tomar PRIOR? CONÉCTATE POR consultas

No sé por qué no recuerdo, pero no lo sé.

¿Alguien tiene una memoria mnemotécnica útil así que siempre lo recuerdo?

Por ejemplo:

Para ir hacia abajo un árbol desde un nodo - Yo, obviamente, tenía que ver esto :) - haces algo como:

select 
    * 
from 
    node 
connect by 
    prior node_id = parent_node_id 
start with 
    node_id = 1 

Por lo tanto - que empezar con una node_id de 1 (la parte superior de la rama) y la consulta busca todos los nodos donde parent_node_id = 1 y luego se repite hasta la parte inferior del árbol.

Para ir hasta el árbol del prior va en la matriz:

select 
    * 
from 
    node 
connect by 
    node_id = prior parent_node_id 
start with 
    node_id = 10 

Así que a partir en algún lugar de una rama (node_id = 10 en este caso) de Oracle obtiene por primera vez todos los nodos donde el parent_node_id es el mismo que el uno de los cuales es node_id 10.

EDITAR: me todavía consigue este mal por lo que me gustaría añadir una edición aclarar para ampliar el Answ aceptado ER - Así es como lo recuerdo ahora:

select 
    * 
from 
    node 
connect by 
    prior node_id = parent_node_id 
start with 
    node_id = 1 

El 'lenguaje Inglés' versión de este SQL Ahora leo como ...

en el nodo, empezando por la fila en la que node_id = 1, la siguiente fila seleccionada tiene su parent_node_id igual a node_id de la fila anterior ( ).

EDITAR: Quassnoi hace un gran punto - la orden de escribir el SQL hace las cosas mucho más fácil.

select 
    * 
from 
    node 
start with 
    node_id = 1 
connect by 
    parent_node_id = prior node_id 

Esto se siente mucho más claro para mí - el "comienzan con" da la primera fila seleccionada y la "conexión por" da la siguiente fila (s) - en este caso los hijos de node_id = 1.

Respuesta

1

Piense en el orden en el que se van a seleccionar los registros: la columna de enlace de cada registro debe coincidir con la columna de enlace hacia adelante en el registro ANTERIOR seleccionado.

5

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 

pueden ser tratados ya sea como "para cada transacción, encontrar el correspondiente nombre de dimensión ", o" para cada dimensión, encuentre todos los valores de transacción correspondientes ".

Por lo tanto, si la búsqueda para una transacción dada, puse 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 la búsqueda de una dimensión, entonces:

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

Ther ex es muy probable que la consulta utilice escaneos de índice primero en (t.id), luego en (d.id), mientras que el último usará escaneos de índice primero en (d.id), luego en (t.dimension), y puede verlo fácilmente en la consulta misma: el mar Los campos rched están a la izquierda.

La conducción y tablas pueden ser impulsadas no es tan obvio en un JOIN, pero es tan claro como una campana para una consulta CONNECT BY: la fila PRIOR está conduciendo, la no PRIOR es impulsado.

Es por eso que esta consulta:

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

significa "encontrar todas las filas cuyos parent es un hecho id". Esta consulta crea una jerarquía.

Esto puede ser tratado de esta manera:

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 cuyos id es un hecho parent". Esta consulta construye una cadena de ancestros.

Siempre ponga PRIOR en la parte derecha de la expresión.

Piense en PRIOR column como una constante se buscarán todas sus filas.

+1

Me gusta "Siempre ponga PRIOR en la parte derecha de la expresión" - lo hace más fácil. También poniendo "comienzo con" al comienzo. –

Cuestiones relacionadas