Zawsze staram się umieszczać wyrażenia w JOIN
jest w następującej kolejności:
joined.column = leading.column
To zapytanie:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
można traktować jako „dla każdej transakcji znajdź odpowiednią nazwę wymiaru” lub „dla każdego wymiaru znajdź wszystkie odpowiadające wartości transakcji”.
Tak więc, jeśli szukam danej transakcji, układam wyrażenia w następującej kolejności:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
, a jeśli szukam wymiaru, to:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Poprzednie zapytanie najprawdopodobniej użyje najpierw skanowania indeksu w (t.id)
, a następnie (d.id
), podczas gdy ta ostatnia użyje najpierw skanowania indeksu w (d.id)
, a następnie (t.dimension)
, i możesz to łatwo zobaczyć w samym zapytaniu:przeszukiwane pola znajdują się po lewej stronie.
Tabele sterujące i sterowane mogą nie być tak oczywiste w JOIN
, ale jest to jasne jak dzwonek dla CONNECT BY
zapytanie:PRIOR
rząd prowadzi, nie PRIOR
jest napędzany.
Dlatego to zapytanie:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
oznacza "znajdź wszystkie wiersze, których parent
jest podanym id
". To zapytanie tworzy hierarchię.
Można to potraktować w następujący sposób:
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);
}
}
I to zapytanie:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
oznacza "znajdź wiersze, których id
jest danym parent
". To zapytanie tworzy łańcuch przodków.
Zawsze umieszczaj PRIOR
w prawej części wyrażenia.
Pomyśl o PRIOR column
na stałe wszystkie Twoje wiersze będą wyszukiwane.