Jeg forsøger altid at sætte udtrykkene i JOIN
er i følgende rækkefølge:
joined.column = leading.column
Denne forespørgsel:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
kan behandles enten som "find det tilsvarende dimensionsnavn for hver transaktion" eller "find alle tilsvarende transaktionsværdier for hver dimension".
Så hvis jeg søger efter en given transaktion, sætter jeg udtrykkene i følgende rækkefølge:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
, og hvis jeg søger efter en dimension, så:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Den tidligere forespørgsel vil højst sandsynligt bruge indeksscanninger først på (t.id)
, derefter på (d.id
), mens sidstnævnte vil bruge indeksscanninger først på (d.id)
, derefter på (t.dimension)
, og du kan nemt se det i selve forespørgslen:de søgte felter er til venstre.
Køre- og køretabellerne er måske ikke så tydelige i en JOIN
, men det er lige så tydeligt som en klokke for en CONNECT BY
forespørgsel:PRIOR
rækken kører, den ikke-PRIOR
er kørt.
Det er derfor denne forespørgsel:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
betyder "find alle rækker, hvis parent
er et givet id
". Denne forespørgsel opbygger et hierarki.
Dette kan behandles sådan her:
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);
}
}
Og denne forespørgsel:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
betyder "find de rækker, hvis id
er en given parent
". Denne forespørgsel bygger en herkomstkæde.
Indsæt altid PRIOR
i højre del af udtrykket.
Tænk på PRIOR column
som konstant vil alle dine rækker blive søgt efter.