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

Oracle SQ Identyfikuj rodzeństwo poprzez rodzeństwo

Nie jest jasne, czy relacje są zwrotne (np. czy B jest "rodzeństwem" A następnie A jest "rodzeństwem" B ), ponieważ masz kilka zduplikowanych wierszy z odwróconymi relacjami w Twoich danych, a niektóre, w których ta właściwość nie jest widoczna.

Zakładając, że twoje relacje nie są odruchowe, to:

SQL Fiddle

Konfiguracja schematu 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;

Zapytanie 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

Wyniki :

| 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 |

Zapytanie 2 :Jeśli są odruchowe, możesz użyć UNION [ALL] aby zduplikować tabelę z relacjami w odwrotnym kierunku, a następnie użyj poprzedniej techniki:

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

Wyniki :

| 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. Jak dodać ojdbc7 do aplikacji webowej Java autorstwa Gradle?

  2. Niewrażliwy i wrażliwy na przewijanie typu JDBC

  3. Jak znaleźć parametry w zapytaniu Oracle otrzymanym od v$sql?

  4. wyjście, które ma pierwszą i ostatnią literę jako samogłoskę(a,e,i,o,u)

  5. Obracanie danych za pomocą dwóch kolumn