Не е ясно дали връзките са рефлексивни (т.е. ако B
е "брат" на A
след това A
е "брат" на B
), тъй като имате някои дублиращи се редове с обърнати връзки във вашите данни и някои, където това свойство не е очевидно.
Ако приемем, че вашите взаимоотношения не са рефлексивни, тогава:
Настройка на схема на Oracle 11g R2 :
CREATE TABLE A (ID, SIBS) ASSELECT 'A', 'B' FROM DUAL UNION ALLSELECT 'A', 'C' FROM DUAL UNION ALLSELECT 'B', 'A' FROM DUAL UNION ALLSELECT 'C ', 'A' ОТ DUAL UNION ALLSELECT 'C', 'D' DUAL UNION ALLSELECT 'D', 'C' ОТ DUAL UNION ALLSELECT 'E', 'F' ОТ DUAL UNION ALLSELECT 'F', 'G' ОТ DUAL UNION ALLSELECT 'G', 'H' FROM DUAL;
Заявка 1 :
SELECT DISTINCT CONNECT_BY_ROOT( ID ) AS ID, SIBSFROM AWHERE CONNECT_BY_ROOT( ID ) <> SIBSCONNECT BY NOCYCLE PRIOR SIBS =IDORDER BY ID, SIBS
<предварителен код>| ID | SIBS ||----|------|| A | Б || A | C || A | D || B | А || B | C || B | D || C | А || C | Б || C | D || D | А || D | Б || D | C || E | F || E | G || E | З || F | G || F | З || G | H |
Заявка 2 :Ако са рефлексивни, можете да използвате UNION [ALL]
за да дублирате таблицата с релациите в обратна посока и след това да използвате предишната техника:
SELECT DISTINCT CONNECT_BY_ROOT( ID ) AS ID, SIBSFROM ( SELECT ID, SIBS FROM A UNION SELECT SIBS, ID FROM A) WHERE CONNECT_BY_ROOT( ID ) <> SIBSCONNECT BY NOCYCLE PRIOR SIBS =IDORDER BY ID, SIBSкод>
<предварителен код>| ID | SIBS ||----|------|| A | Б || A | C || A | D || B | А || B | C || B | D || C | А || C | Б || C | D || D | А || D | Б || D | C || E | F || E | G || E | З || F | E || F | G || F | З || G | E || G | F || G | З || H | E || H | F || H | G |