SELECT *
FROM (
SELECT username
FROM friends
START WITH
username = 'myname'
CONNECT BY
friendname = PRIOR username
AND level <= 3
)
WHERE username = 'friendname'
AND rownum = 1
आवश्यकतानुसार स्तर अपडेट करें:आप तृतीय स्तर के मित्र आदि खोज सकते हैं।
अगर दोस्ती का रिश्ता सममित है, तो आपको निम्नलिखित प्रश्न पूछने चाहिए:
WITH q AS
(
SELECT username, friendname
FROM friends
UNION ALL
SELECT friendname, username
FROM friends
),
f AS
(
SELECT friendname, level
FROM q
START WITH
username = 'Thomas'
CONNECT BY NOCYCLE
username = PRIOR friendname
)
SELECT *
FROM f
WHERE friendname = 'Jo'
AND rownum = 1
यदि आप अपनी तालिका का सामान्यीकरण करते हैं, तो इस क्वेरी को बहुत तेज़ बनाया जा सकता है:प्रति मित्रता के लिए दो रिकॉर्ड संग्रहीत करें, जैसे:
CREATE TABLE dual_friends (orestes NOT NULL, pylades NOT NULL, CONSTRAINT pk_dualfriends_op PRIMARY KEY (orestes, pylades)) ORGANIZATION INDEX
AS
SELECT username, friendname
FROM friends
UNION ALL
SELECT friendname, username
FROM friends
तब आप बस CTE
. को बदल सकते हैं ऊपर dual_friends
. के साथ :
WITH f AS
(
SELECT pylades, level
FROM dual_friends
START WITH
orestes = 'Thomas'
CONNECT BY NOCYCLE
orestes = PRIOR pylades
AND level <= 3
)
SELECT *
FROM f
WHERE pylades = 'Jo'
AND rownum = 1
, जो सूचकांक का उपयोग करेगा और अधिक कुशल होगा, खासकर यदि आप स्तर को कुछ उचित मूल्य तक सीमित करते हैं।