PostgreSQL La base de donnees la plus sophistiquee au monde.

Soit le script

CREATE TABLE test_ref (
    id integer,
    tvalue text,
    tparent integer
);


INSERT INTO test_ref VALUES (1, 'Department IT', NULL);
INSERT INTO test_ref VALUES (2, 'Departement HR', NULL);
INSERT INTO test_ref VALUES (3, 'Departement fourniture IT', 1);
INSERT INTO test_ref VALUES (4, 'Departement Machine IT', 1);
INSERT INTO test_ref VALUES (5, 'Departement Server', 4);
INSERT INTO test_ref VALUES (6, 'Departemet Machine bureau', 4);
INSERT INTO test_ref VALUES (7, 'Departement logiciel server', 5);
INSERT INTO test_ref VALUES (8, 'Departement relation', 2);
INSERT INTO test_ref VALUES (9, 'Departement event', 2);
INSERT INTO test_ref VALUES (10, 'Departement secretariat', 2);
INSERT INTO test_ref VALUES (14, 'Departement procedure', 10);
INSERT INTO test_ref VALUES (15, 'Sous departement procedure', 14);
INSERT INTO test_ref VALUES (16, 'Sous sous departement procedure', 15);

Je souhaite trouver tout les enregistrements qui dépendent directement ou directement d'un département. Par exemple : j'aimerais savoir tout ce qui dépend du département 1, directement ET indirectement

La solution la plus simple est d'utiliser une fonction récursive, évidemment, c'est lourd en performance et avec des grande table, ce n'est pas la solution optimale

create or replace function get_tree(value integer)
returns setof test_ref
as
$_$
declare
        n integer;
        i record;
        e record;
begin
        raise notice 'Call get_tree(%)', value;
        for i in select * from test_ref where tparent=value loop
                raise notice 'return tparent i %',i.id;
                return next i;

                for e in select * from get_tree(i.id) loop
                        raise notice 'recursive part tparent e %',e.id;
                        return next e;
                end loop;

        end loop;

        raise notice 'Call get_tree(%) finished ', value;
        return;



end;
$_$ language plpgsql;

Testons pour voir, tous les département dépendant du 1 (Département IT)


 select * from get_tree(1);


id |           tvalue            | tparent
----+-----------------------------+---------
  3 | Departement fourniture IT   |       1
  4 | Departement Machine IT      |       1
  5 | Departement Server          |       4
  7 | Departement logiciel server |       5
  6 | Departemet Machine bureau   |       4
 
support/trucs_et_astuces/trouver_tous_les_enregistrements_filles_d_un_enregistrement.txt · Dernière modification: 2010/04/20 17:27 par sparky