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

Oracle SQ Mengidentifikasi Saudara melalui saudara kandung

Tidak jelas apakah hubungan itu refleksif (yaitu jika B adalah "saudara" dari A lalu A adalah "saudara" dari B ) karena Anda memiliki beberapa baris duplikat dengan hubungan terbalik dalam data Anda dan beberapa di mana properti ini tidak terlihat.

Dengan asumsi bahwa hubungan Anda tidak refleksif maka:

SQL Fiddle

Pengaturan Skema Oracle 11g R2 :

CREATE TABLE A ( ID, SIBS ) AS
SELECT 'A', 'B' FROM DUAL UNION ALL
SELECT 'A', 'C' FROM DUAL UNION ALL
SELECT 'B', 'A' FROM DUAL UNION ALL
SELECT 'C', 'A' FROM DUAL UNION ALL
SELECT 'C', 'D' FROM DUAL UNION ALL
SELECT 'D', 'C' FROM DUAL UNION ALL
SELECT 'E', 'F' FROM DUAL UNION ALL
SELECT 'F', 'G' FROM DUAL UNION ALL
SELECT 'G', 'H' FROM DUAL;

Kueri 1 :

SELECT DISTINCT
       CONNECT_BY_ROOT( ID ) AS ID,
       SIBS
FROM   A
WHERE  CONNECT_BY_ROOT( ID ) <> SIBS
CONNECT BY NOCYCLE
       PRIOR SIBS = ID
ORDER BY ID, SIBS

Hasil :

| ID | SIBS |
|----|------|
|  A |    B |
|  A |    C |
|  A |    D |
|  B |    A |
|  B |    C |
|  B |    D |
|  C |    A |
|  C |    B |
|  C |    D |
|  D |    A |
|  D |    B |
|  D |    C |
|  E |    F |
|  E |    G |
|  E |    H |
|  F |    G |
|  F |    H |
|  G |    H |

Kueri 2 :Jika mereka refleksif maka Anda dapat menggunakan UNION [ALL] untuk menduplikasi tabel dengan hubungan dalam arah sebaliknya dan kemudian menggunakan teknik sebelumnya:

SELECT DISTINCT
       CONNECT_BY_ROOT( ID ) AS ID,
       SIBS
FROM   (
  SELECT ID, SIBS FROM A
  UNION
  SELECT SIBS, ID FROM A
)
WHERE  CONNECT_BY_ROOT( ID ) <> SIBS
CONNECT BY NOCYCLE
       PRIOR SIBS = ID
ORDER BY ID, SIBS

Hasil :

| ID | SIBS |
|----|------|
|  A |    B |
|  A |    C |
|  A |    D |
|  B |    A |
|  B |    C |
|  B |    D |
|  C |    A |
|  C |    B |
|  C |    D |
|  D |    A |
|  D |    B |
|  D |    C |
|  E |    F |
|  E |    G |
|  E |    H |
|  F |    E |
|  F |    G |
|  F |    H |
|  G |    E |
|  G |    F |
|  G |    H |
|  H |    E |
|  H |    F |
|  H |    G |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BEGIN - AKHIR transaksi blok atom di PL/SQL

  2. Menjalankan total grup berulang berdasarkan item berdasarkan waktu di Oracle SQL

  3. Membuat Aplikasi Java di Oracle JDeveloper, Bagian 1

  4. Tidak dapat menjatuhkan tabel yang baru saja dibuat

  5. Menggunakan klausa IN dengan string yang dibatasi koma dari output fungsi replace() di Oracle SQL