Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle SQ भाई-बहनों के माध्यम से भाई-बहनों की पहचान करता है

यह स्पष्ट नहीं है कि क्या संबंध रिफ्लेक्टिव हैं (अर्थात यदि B A . का "भाई" है फिर A B . का "भाई" है ) क्योंकि आपके डेटा में उल्टे संबंधों के साथ कुछ डुप्लिकेट पंक्तियाँ हैं और कुछ ऐसी हैं जहाँ यह संपत्ति स्पष्ट नहीं है।

यह मानते हुए कि आपके रिश्ते रिफ्लेक्टिव नहीं हैं:

SQL Fiddle

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;

क्वेरी 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

परिणाम :

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

प्रश्न 2 :अगर वे रिफ्लेक्टिव हैं तो आप UNION [ALL] . का इस्तेमाल कर सकते हैं तालिका को विपरीत दिशा में संबंधों के साथ डुप्लिकेट करने के लिए और फिर पिछली तकनीक का उपयोग करें:

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

परिणाम :

| 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. SQL क्वेरी, औसत चढ़ाई और जोड़ी जो सबसे अधिक चोटियों पर चढ़ी है

  2. Oracle नवीनतम दिनांक रिकॉर्ड का चयन करें

  3. रन टाइम त्रुटि:-2147217887(80040e21) सिस्टम ओराओएलईडीबी के लिए संदेश फ़ाइल में संदेश संख्या 0x80040e21 के लिए संदेश पाठ नहीं ढूंढ सकता है

  4. Oracle एक्सप्रेस में ट्रिगर बनाना

  5. क्या स्पष्ट एएनएसआई जॉइन बनाम निहित जॉइन के उपयोग पर ओरेकल की आधिकारिक सिफारिश है?