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.