Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल एसक्यूएल एक एसक्यूएल स्टेटमेंट कैसे लिखना है जो सत्यापित करता है कि मेरे नेटवर्क में उपयोगकर्ता (यानी दोस्तों या दोस्तों के दोस्त)

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

, जो सूचकांक का उपयोग करेगा और अधिक कुशल होगा, खासकर यदि आप स्तर को कुछ उचित मूल्य तक सीमित करते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 कार्य जो Oracle में डेटाटाइम मान से सेकंड लौटाते हैं

  2. कैसे refcursor में एक बूलियन वापस करने के लिए?

  3. क्या तालिका में विभिन्न पंक्तियों को अद्यतन और हटाते समय गतिरोध संभव है?

  4. ओरेकल पीएल/एसक्यूएल - एक साधारण सरणी चर कैसे बनाएं?

  5. प्राथमिक सूचकांक और द्वितीयक सूचकांक में वास्तव में क्या अंतर है?