sql >> Database >  >> RDS >> Oracle

Oracle SQL hoe een sql-instructie te schrijven die verifieert of de gebruiker in mijn netwerk (dwz vrienden of vriend van vrienden)

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

Werk het niveau indien nodig bij:u kunt zoeken naar vrienden van de derde laag, enz.

Als de vriendschapsrelatie symmetrisch is, moet u de volgende vraag stellen:

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

Deze query kan veel sneller worden gedaan als je je tafel denormaliseert:sla twee records per vriendschap op, zoals deze:

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

Dan kun je gewoon de CTE . vervangen hierboven met de 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

, die de index zal gebruiken en veel efficiënter zal zijn, vooral als u het niveau tot een redelijke waarde beperkt.



  1. SQL:ISNULL gebruiken met dynamische pivot

  2. Gegevens ophalen uit opgeslagen procedure met Entity Framework

  3. Geaggregeerde sleutel/waarde-paren uit een JSONB-veld afvlakken?

  4. Hoe optimaliseer ik een database voor superstring-query's?