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

MySqlsql再帰ループ

    データベース内のツリー構造化データを処理するための私のfaroviteトリックは、列FullIDを追加することです。 複雑な(おそらく再帰的な)SQL/ストアドプロシージャを回避するためにテーブルに移動します。

    FullID     id  parent   name
    -----------------------------
    1          1   null     root1
    2          2   null     root2
    2.3        3   2        home
    2.3.4      4   3        child
    2.3.4.5    5   4        sub_child
    2.3.4.5.6  6   5        sub_sub_child
    

    したがって、ルートページIDを見つけるには、FullIDの最初の部分を抽出するだけです。 SQLまたはアプリケーション言語を介して。

    SQLを使用している場合は、次のSQLを使用してルートIDを取得できます。

    -- MySQL dialect
    select substring_index(FullID,'.',1) as RootID from table;
    
    -- SQL Server dialect
    select case charindex('.', FullID) when 0 then FullID else substring(FullID, 1, charindex('.', FullID)-1) end as RootID from table
    

    ノードとその子を削除するには

    DELETE table WHERE id=<CURRENT_NODE_ID> OR FullID LIKE '<CURREN_NODE_FULLID>.%'
    

    ノードとその子を移動するには

    -- change the parent of current node:
    UPDATE table
    SET parent=<NEW_PARENT_ID>
    WHERE id=<CURRENT_NODE_ID>
    
    -- update it's FullID and all children's FullID:
    UPDATE table
    SET FullID=REPLACE(FullID,<CURRENT_NODE_PARENT_FULLID>, <NEW_PARENT_FULLID>)
    WHERE (id=<CURRENT_NODE_ID> OR FullID LIKE '<CURRENT_NODE_FULLID>.%')
    

    このトリックは、限られたツリーレベルのケース、またはFullIDにのみ適用されます。 ツリーレベルが深すぎると、長いコンテンツを保持できません。



    1. DG4ODBCのOracle言語パラメータの設定

    2. OracleCloudのMAAドキュメント

    3. レールはグループ化後に最新の値を表示します

    4. NULL値でNOTIN選択