Tôi luôn cố gắng đặt các biểu thức trong JOIN
theo thứ tự sau:
joined.column = leading.column
Truy vấn này:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
có thể được coi như "cho mỗi giao dịch, tìm tên thứ nguyên tương ứng" hoặc "cho mỗi thứ nguyên, tìm tất cả các giá trị giao dịch tương ứng".
Vì vậy, nếu tôi tìm kiếm một giao dịch nhất định, tôi đặt các biểu thức theo thứ tự sau:
SELECT t.value, d.name
FROM transactions t
JOIN
dimensions d
ON d.id = t.dimension
WHERE t.id = :myid
và nếu tôi tìm kiếm thứ nguyên, thì:
SELECT t.value, d.name
FROM dimensions d
JOIN
transactions t
ON t.dimension = d.id
WHERE d.id = :otherid
Truy vấn trước đây của họ hầu hết có thể sẽ sử dụng quét chỉ mục trước trên (t.id)
, rồi bật (d.id
), trong khi cái sau sẽ sử dụng quét chỉ mục trước trên (d.id)
, sau đó trên (t.dimension)
và bạn có thể dễ dàng nhìn thấy nó trong chính truy vấn:các trường được tìm kiếm nằm ở bên trái.
Các bảng điều khiển và điều khiển có thể không quá rõ ràng trong JOIN
, nhưng nó rõ ràng như một hồi chuông cho một CONNECT BY
truy vấn:PRIOR
hàng đang lái xe, hàng không phải PRIOR
được thúc đẩy.
Đó là lý do tại sao truy vấn này:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
có nghĩa là "tìm tất cả các hàng có parent
là một id
nhất định ". Truy vấn này xây dựng một hệ thống phân cấp.
Điều này có thể được xử lý như thế này:
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);
}
}
Và truy vấn này:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
có nghĩa là "tìm các hàng có id
là parent
nhất định ". Truy vấn này xây dựng một chuỗi tổ tiên.
Luôn đặt PRIOR
trong phần bên phải của biểu thức.
Hãy nghĩ đến PRIOR column
như một hằng số, tất cả các hàng của bạn sẽ được tìm kiếm.