Oracle
 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

Актуализирайте нивото, ако е необходимо:можете да търсите приятели от третия слой и т.н.

Ако приятелската връзка е симетрична, трябва да направите следната заявка:

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. Получаване на ORA-01031:недостатъчни привилегии при запитване към таблица вместо ORA-00942:таблица или изглед не съществува

  2. Можете ли да използвате именувани параметри в Laravel Eloquent

  3. Динамична опорна точка в oracle sql

  4. Как да вмъкна/актуализирам по-голям размер на данни в таблиците на Oracle?

  5. как да генерирате план за обяснение за цялата съхранена процедура