मैं हमेशा भावों को 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
के बारे में सोचें आपकी सभी पंक्तियों की निरंतर खोज की जाएगी।