Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle SQL cara menulis pernyataan sql yang memverifikasi apakah pengguna di jaringan saya (yaitu teman atau teman dari teman)

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

Perbarui level seperlunya:Anda dapat mencari teman lapis ketiga, dll.

Jika hubungan pertemanan simetris, Anda harus membuat kueri berikut:

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

Kueri ini dapat dibuat lebih cepat jika Anda mendenormalisasi tabel Anda:simpan dua catatan per pertemanan, seperti ini:

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

Kemudian Anda tinggal mengganti CTE di atas dengan 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

, yang akan menggunakan indeks dan jauh lebih efisien, terutama jika Anda membatasi level ke nilai yang wajar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. InstallAllOracleASPNETProviders tidak bekerja dengan benar

  2. Bagaimana cara mengembalikan bolen di refcursor?

  3. Pilih yang berbeda pada gumpalan

  4. Jumlah baris yang terpengaruh oleh UPDATE di PL/SQL

  5. System.Data.OracleClient namespace dihentikan?