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.