Vždy se snažím vkládat výrazy do JOIN
's v následujícím pořadí:
joined.column = leading.column
Tento dotaz:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
lze zacházet buď jako „pro každou transakci vyhledejte odpovídající název dimenze“ nebo „pro každou dimenzi vyhledejte všechny odpovídající hodnoty transakce“.
Pokud tedy hledám danou transakci, dám výrazy v následujícím pořadí:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
a pokud hledám dimenzi, pak:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Předchozí dotaz bude s největší pravděpodobností nejprve používat prohledávání indexů na (t.id)
a poté na (d.id
), zatímco druhý z nich bude používat indexové skenování nejprve na (d.id)
a poté na (t.dimension)
a můžete to snadno vidět v samotném dotazu:hledaná pole jsou vlevo.
Řídicí a řízené tabulky nemusí být v JOIN
tak zřejmé , ale je to jasné jako zvonek pro CONNECT BY
dotaz:PRIOR
řádek je hnací, jiný než PRIOR
je řízen.
Proto tento dotaz:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
znamená "najít všechny řádky, jejichž parent
je dané id
". Tento dotaz vytváří hierarchii.
S tím lze zacházet takto:
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);
}
}
A tento dotaz:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
znamená "najít řádky, jejichž id
je daný parent
". Tento dotaz vytváří řetězec předků.
Vždy zadávejte PRIOR
v pravé části výrazu.
Přemýšlejte o PRIOR column
od konstanty budou prohledány všechny vaše řádky.