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

階層データを取得するためのMYSQLでの再帰的ストアドプロシージャのパフォーマンス

    かなり単純な反復隣接リストdbサーバー側ソリューション: http://pastie.org/1056977

    delimiter ;
    
    drop procedure if exists employee_hier;
    
    delimiter #
    
    create procedure employee_hier
    (
    in p_emp_id smallint unsigned
    )
    begin
    
    declare p_done tinyint unsigned default(0);
    declare p_depth smallint unsigned default(0);
    
    create temporary table hier(
     boss_id smallint unsigned, 
     emp_id smallint unsigned, 
     depth smallint unsigned
    )engine = memory;
    
    insert into hier values (null, p_emp_id, p_depth);
    
    /* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */
    
    create temporary table emps engine=memory select * from hier;
    
    while p_done <> 1 do
    
        if exists( select 1 from employee e inner join hier on e.boss_id = hier.emp_id and hier.depth = p_depth) then
    
            insert into hier select e.boss_id, e.emp_id, p_depth + 1 
                from employee e inner join emps on e.boss_id = emps.emp_id and emps.depth = p_depth;
    
            set p_depth = p_depth + 1;          
    
            truncate table emps;
            insert into emps select * from hier where depth = p_depth;
    
        else
            set p_done = 1;
        end if;
    
    end while;
    
    select 
     e.emp_id,
     e.name as emp_name,
     b.emp_id as boss_emp_id,
     b.name as boss_name,
     hier.depth
    from 
     hier
    inner join employee e on hier.emp_id = e.emp_id
    inner join employee b on hier.boss_id = b.emp_id;
    
    drop temporary table if exists hier;
    drop temporary table if exists emps;
    
    end #
    
    delimiter ;
    
    
    call employee_hier(1);
    call employee_hier(3);
    


    1. sqlite(android)でのアクセント付き検索

    2. SQLServerのランキング関数

    3. PostGISを使用して特定のポイントのn最近傍を検索しますか?

    4. MicrosoftAccessがスタートアップに最適な5つの理由