Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle SQL cách viết câu lệnh sql xác minh xem người dùng trong mạng của tôi (tức là bạn bè hoặc bạn của bạn bè)

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

Cập nhật cấp độ nếu cần:bạn có thể tìm kiếm bạn bè ở lớp thứ ba, v.v.

Nếu mối quan hệ bạn bè là đối xứng, bạn nên thực hiện truy vấn sau:

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

Truy vấn này có thể được thực hiện nhanh hơn nhiều nếu bạn không chuẩn hóa bảng của mình:lưu trữ hai bản ghi cho mỗi tình bạn, như sau:

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

Sau đó, bạn chỉ có thể thay thế CTE ở trên với 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

, sẽ sử dụng chỉ mục và hiệu quả hơn nhiều, đặc biệt nếu bạn giới hạn mức ở một số giá trị hợp lý.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay thế hoặc xóa nhiều dòng văn bản trong quy trình được lưu trữ oracle

  2. Sử dụng Trigger trong Oracle để ghi các thay đổi đối với A Table

  3. SQL:Cách thêm giá trị theo cột chỉ mục

  4. chức năng tổng hợp oracle với nhiều cột

  5. Khai báo mảng động trong Oracle PL / SQL