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