Винаги се опитвам да поставя изразите в JOIN
е в следния ред:
joined.column = leading.column
Тази заявка:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
може да се третира или като „за всяка транзакция намерете съответното име на измерение“, или „за всяко измерение намерете всички съответстващи стойности на транзакция“.
Така че, ако търся дадена транзакция, поставям изразите в следния ред:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
и ако търся измерение, тогава:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Предишната заявка най-вероятно ще използва индексни сканирания първо на (t.id)
, след това върху (d.id
), докато последният ще използва индексни сканирания първо на (d.id)
, след това върху (t.dimension)
и можете лесно да го видите в самата заявка:полетата за търсене са вляво.
Задвижващите и управляваните таблици може да не са толкова очевидни в JOIN
, но е ясно като звънец за CONNECT BY
заявка:PRIOR
редът се управлява, не-PRIOR
се управлява.
Ето защо тази заявка:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
означава „намиране на всички редове, чийто parent
е даден id
". Тази заявка изгражда йерархия.
Това може да се третира по следния начин:
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);
}
}
И тази заявка:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
означава „намерете редовете, чийто id
е даден parent
". Тази заявка изгражда верига от предци.
Винаги поставяйте PRIOR
в дясната част на израза
Помислете за PRIOR column
като константа всички ваши редове ще бъдат търсени.