関係が再帰的であるかどうかは不明です (つまり、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' FROM DUAL UNION ALLSELECT 'C', 'D' FROM DUAL UNION ALLSELECT 'D', 'C' FROM DUAL UNION ALLSELECT 'E', 'F' FROM DUAL UNION ALLSELECT 'F', 'G' FROM 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 =ID による ID オーダー、SIBS
プレ>結果 :
<プレ>| ID | SIBS ||----|------|| A | B || A | C || A | D || B | || B | C || B | D || C | || C | B || C | D || D | || D | B || D | C || E |ふ || E | G || E | || ひ ||ふ | 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 | B || A | C || A | D || B | || B | C || B | D || C | || C | B || C | D || D | || D | B || D | C || E |ふ || E | G || E | || ひ ||ふ |え ||ふ | G ||ふ | || ひ ||ガ |え ||ガ |ふ ||ガ | || ひ ||ひ |え ||ひ |ふ ||ひ | G |
プレ>