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.