Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je me rappeler dans quel sens PRIOR doit aller dans les requêtes CONNECT BY

J'essaie toujours de mettre les expressions dans JOIN est dans l'ordre suivant :

joined.column = leading.column

Cette requête :

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

peut être traité comme "pour chaque transaction, recherchez le nom de la dimension correspondante", ou "pour chaque dimension, recherchez toutes les valeurs de transaction correspondantes".

Ainsi, si je recherche une transaction donnée, je mets les expressions dans l'ordre suivant :

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

, et si je recherche une dimension, alors :

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

L'ancienne requête utilisera probablement d'abord les analyses d'index sur (t.id) , puis sur (d.id ), tandis que ce dernier utilisera d'abord les analyses d'index sur (d.id) , puis sur (t.dimension) , et vous pouvez facilement le voir dans la requête elle-même :les champs recherchés sont à gauche.

Les tables pilotantes et pilotées peuvent ne pas être si évidentes dans un JOIN , mais c'est aussi clair qu'une cloche pour un CONNECT BY requête :le PRIOR ligne est conduite, le non-PRIOR est entraîné.

C'est pourquoi cette requête :

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

signifie "trouver toutes les lignes dont le parent est un id donné ". Cette requête construit une hiérarchie.

Cela peut être traité comme ceci :

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);
  }
}

Et cette requête :

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

signifie "trouver les lignes dont id est un parent donné ". Cette requête construit une chaîne d'ascendance.

Toujours mettre PRIOR dans la partie droite de l'expression.

Pensez à la PRIOR column à partir d'une constante toutes vos lignes seront recherchées.