Saya selalu mencoba untuk menempatkan ekspresi di JOIN
dalam urutan sebagai berikut:
joined.column = leading.column
Kueri ini:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
dapat diperlakukan seperti "untuk setiap transaksi, temukan nama dimensi yang sesuai", atau "untuk setiap dimensi, temukan semua nilai transaksi yang sesuai".
Jadi, jika saya mencari transaksi tertentu, saya menempatkan ekspresi dalam urutan berikut:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
, dan jika saya mencari dimensi, maka:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Permintaan sebelumnya kemungkinan besar akan menggunakan pemindaian indeks terlebih dahulu pada (t.id)
, lalu pada (d.id
), sedangkan yang terakhir akan menggunakan scan indeks terlebih dahulu pada (d.id)
, lalu pada (t.dimension)
, dan Anda dapat dengan mudah melihatnya dalam kueri itu sendiri:bidang yang dicari ada di sebelah kiri.
Tabel penggerak dan yang digerakkan mungkin tidak begitu jelas dalam JOIN
, tapi sejelas lonceng untuk CONNECT BY
kueri:PRIOR
baris mengemudi, non-PRIOR
didorong.
Itu sebabnya pertanyaan ini:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
berarti "temukan semua baris yang parent
adalah id
yang diberikan ". Kueri ini membangun hierarki.
Ini bisa diperlakukan seperti ini:
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);
}
}
Dan pertanyaan ini:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
berarti "menemukan baris yang id
adalah parent
yang diberikan ". Kueri ini membangun rantai leluhur.
Selalu cantumkan PRIOR
di bagian kanan ekspresi.
Pikirkan PRIOR column
secara konstan semua baris Anda akan dicari.