sql >> データベース >  >> RDS >> Oracle

Oracle SQは兄弟を介して兄弟を識別します

    関係が再帰的であるかどうかは不明です (つまり、B の場合) A の「兄弟」です 次に A B の「兄弟」です ) データ内に逆の関係を持つ重複行がいくつかあり、このプロパティが明らかでない場所もあるためです。

    あなたの関係が再帰的でないと仮定すると:

    SQL フィドル

    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 |

    1. T-SQLを使用して区切り文字を使用して文字列を分割するにはどうすればよいですか?

    2. 複数のファイルをサーバーにアップロードし、データベースに書き込みます

    3. mysql_last_id()を使用した競合状態

    4. MySQLを使用して整数のゼロの数を取得する