sql >> Database teknologi >  >> RDS >> Oracle

Oracle SQL hvordan man skriver en sql-sætning, der verificerer, om brugeren er i mit netværk (dvs. venner eller venners venner)

SELECT  *
FROM    (
        SELECT  username
        FROM    friends
        START WITH
                username = 'myname'
        CONNECT BY
                friendname = PRIOR username
                AND level <= 3
        )
WHERE   username = 'friendname'
        AND rownum = 1

Opdater niveauet efter behov:du kan søge efter venner fra tredje lag osv.

Hvis venskabsforholdet er symmetrisk, skal du stille følgende forespørgsel:

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

Denne forespørgsel kan laves meget hurtigere, hvis du denormaliserer din tabel:gem to poster pr. venskab, sådan her:

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

Så kan du bare erstatte CTE ovenfor med 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

, som vil bruge indekset og være meget mere effektivt, især hvis du begrænser niveauet til en rimelig værdi.



  1. Vis blob-billede i html med angularjs

  2. PHP/PDO:Forberedte udsagn virker ikke, når du opretter en tabel?

  3. Meget lang åbningstid for SQL-forbindelse

  4. ODBC-opkald mislykkedes med lagret procedure - Send forespørgsel igennem