Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle SQL, jak napisać instrukcję sql, która weryfikuje, czy użytkownik w mojej sieci (np. znajomi lub znajomi znajomych)

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

W razie potrzeby zaktualizuj poziom:możesz szukać znajomych z trzeciej warstwy itp.

Jeśli relacja przyjaźni jest symetryczna, należy wykonać następujące zapytanie:

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

To zapytanie można wykonać znacznie szybciej, jeśli zdenormalizujesz swoją tabelę:przechowuj dwa rekordy na przyjaźń, tak jak poniżej:

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

Następnie możesz po prostu zastąpić CTE powyżej z 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

, który użyje indeksu i będzie znacznie wydajniejszy, zwłaszcza jeśli ograniczysz poziom do jakiejś rozsądnej wartości.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak losowo pobrać rekordy z bazy danych Oracle?

  2. Dlaczego zapytanie SELECT nie rozpoczyna transakcji? [Wyrocznia]

  3. Czy Oracle zablokuje całą tabelę podczas wykonywania instrukcji DML, czy tylko wiersz?

  4. Jak rozwiązać ORA-06512 pod numerem linii

  5. ORA-00942:tabela lub widok nie istnieje dla tabeli i kolumn mieszanych wielkości liter