sql >> Databáze >  >> RDS >> Oracle

Oracle SQL, jak napsat příkaz SQL, který ověří, zda je uživatel v mé síti (tj. přátelé nebo přítel přátel)

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

Aktualizujte úroveň podle potřeby:můžete hledat přátele třetí vrstvy atd.

Pokud je přátelský vztah symetrický, měli byste provést následující dotaz:

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

Tento dotaz může být mnohem rychlejší, pokud denormalizujete svůj stůl:uložte dva záznamy na přátelství, například takto:

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

Pak stačí nahradit CTE výše pomocí 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

, který bude používat index a bude mnohem efektivnější, zvláště pokud omezíte úroveň na nějakou rozumnou hodnotu.



  1. Postgresql DROP TABLE nefunguje

  2. Jsou tyto znaky platné pro XML?

  3. Existuje v MySQL FIND_IN_SET podle indexu?

  4. Jak vybrat více než 1 záznam za den?