Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como me lembro de qual caminho PRIOR deve seguir nas consultas CONNECT BY


Eu sempre tento colocar as expressões em JOIN está na seguinte ordem:
joined.column = leading.column

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

pode ser tratado como "para cada transação, encontre o nome da dimensão correspondente" ou "para cada dimensão, encontre todos os valores de transação correspondentes".

Então, se eu pesquisar uma determinada transação, coloco as expressões na seguinte ordem:
SELECT  t.value, d.name
FROM    transactions t
JOIN
        dimensions d
ON      d.id = t.dimension
WHERE   t.id = :myid

, e se eu procurar uma dimensão, então:
SELECT  t.value, d.name
FROM    dimensions d
JOIN
        transactions t
ON      t.dimension = d.id
WHERE   d.id = :otherid

A consulta anterior provavelmente usará verificações de índice primeiro em (t.id) , depois em (d.id ), enquanto o último usará as varreduras de índice primeiro em (d.id) , depois em (t.dimension) , e você pode vê-lo facilmente na própria consulta:os campos pesquisados ​​estão à esquerda.

As tabelas de direcionamento e direcionamento podem não ser tão óbvias em um JOIN , mas é tão claro quanto um sino para um CONNECT BY consulta:o PRIOR linha está dirigindo, o não-PRIOR é conduzido.

Por isso esta consulta:
SELECT  *
FROM    hierarchy
START WITH
        id = :root
CONNECT BY
        parent = PRIOR id

significa "encontrar todas as linhas cujo parent é um determinado id ". Esta consulta cria uma hierarquia.

Isso pode ser tratado assim:
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 esta consulta:
SELECT  *
FROM    hierarchy
START WITH
        id = :leaf
CONNECT BY
        id = PRIOR parent

significa "encontrar as linhas cujo id é um determinado parent ". Esta consulta cria uma cadeia de ancestralidade.

Sempre coloque PRIOR na parte direita da expressão.

Pense na PRIOR column a partir de uma constante, todas as suas linhas serão pesquisadas.