sql >> データベース >  >> RDS >> Oracle

Oracle SQLネットワーク内のユーザー(つまり、友達または友達の友達)かどうかを検証するSQLステートメントの記述方法

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

    必要に応じてレベルを更新します。第3層の友達などを検索できます。

    友情関係が対称的である場合は、次のクエリを実行する必要があります。

    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
    

    テーブルを非正規化すると、このクエリをはるかに高速化できます。次のように、友情ごとに2つのレコードを保存します。

    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. phpformysqlの入力データを安全にエスケープする方法

    2. このクエリを最適化する方法(4 mmのテーブルが含まれます)

    3. AmazonMySQLRDS証明書を入手する方法

    4. RubyおよびMySQLUTF-8文字