Jag försöker alltid lägga uttrycken i JOIN
är i följande ordning:
joined.column = leading.column
Denna fråga:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
kan behandlas antingen som "för varje transaktion, hitta motsvarande dimensionsnamn" eller "för varje dimension, hitta alla motsvarande transaktionsvärden".
Så om jag söker efter en given transaktion lägger jag uttrycken i följande ordning:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
, och om jag söker efter en dimension, då:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Den tidigare frågan kommer troligen att använda indexsökningar först på (t.id)
, sedan på (d.id
), medan den senare kommer att använda indexsökningar först på (d.id)
, sedan på (t.dimension)
, och du kan enkelt se det i själva frågan:de sökta fälten är till vänster.
Tabellerna för körning och körning kanske inte är så uppenbara i en JOIN
, men det är lika tydligt som en klocka för en CONNECT BY
fråga:PRIOR
raden kör, den icke-PRIOR
är körd.
Det är därför denna fråga:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
betyder "hitta alla rader vars parent
är ett givet id
". Den här frågan bygger en hierarki.
Detta kan behandlas så här:
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);
}
}
Och den här frågan:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
betyder "hitta raderna vars id
är en given parent
". Den här frågan bygger en härkomstkedja.
Sätt alltid PRIOR
i den högra delen av uttrycket.
Tänk på PRIOR column
som konstant kommer alla dina rader att sökas efter.