Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de requête récursive Oracle vers Postgres

Problème de migration de requête récursive Oracle vers Postgres

    11 février 2021 à 18:06:23

    Bonjour à tous,

    Voici mon problème, après une migration Oracle vers Postgres je souhaite modifier une requête récursive, cependant je n'arrive pas à avoir les mêmes résultats.

    Voici ma requête Oracle :

    SELECT LEVEL AS NIVEAU_HIERARCHIE -- niveau de hierachie dans la chaine d'indispos contigues , CONNECT_BY_ROOT DATA_GROUPE_INDISPO_kd_kp.ID AS ID_INDISPO_MERE -- id indispo source dans la chaine d'indispos , DATE_FIN_REELLE , DATE_DEBUT_REELLE FROM DATA_GROUPE_INDISPO_kd_kp START WITH -- commencer à partir des indispos inopinées dans la période d'étude ID_INDISPONIBILITE_TYPE NOT IN (1,2,36) -- 1 = prévue s + 1 , 2 = prévue j + 1, 36 = modulation --AND EXTRACT(YEAR FROM DATE_DEBUT_REELLE) >= EXTRACT (YEAR FROM to_date('01/01/2020','DD/MM/YYYY')) - 1 --AND DATE_DEBUT_REELLE <= to_date('31/12/2020','DD/MM/YYYY') + 1 CONNECT BY NOCYCLE -- définition des indipos filles à retrouver à partir de l'indispo précédente, le mot clé prior désigne l'indispo précédente PRIOR ID_GROUPE = ID_GROUPE AND ( -- l'intervalle entre les deux indispos < x minutes et l'indispo fille commence après ABS(PRIOR DATE_FIN_REELLE - DATE_DEBUT_REELLE) <= 1/24/60 * 1000 AND PRIOR DATE_FIN_REELLE <= DATE_DEBUT_REELLE ) AND ID_INDISPONIBILITE_TYPE IN (1,2) -- on ne prend que les indispos prévues à la suite d'une indispo mère non prévue

    Avec les résultats suivant : 

    NIVEAU_HIERARCHIE ID_INDISPO_MERE DATE_FIN_REELLE DATE_DEBUT_REELLE
    1 52998934 27/03/2020 23:59 27/03/2020 00:00
    2 52998934 28/03/2020 23:59 28/03/2020 00:00
    3 52998934 29/03/2020 23:59 29/03/2020 00:00
    4 52998934 30/03/2020 23:59 30/03/2020 00:00
    5 52998934 31/03/2020 23:59 31/03/2020 00:00
    6 52998934 01/04/2020 23:59 01/04/2020 00:00
    7 52998934 02/04/2020 23:59 02/04/2020 00:00
    8 52998934 03/04/2020 23:59 03/04/2020 00:00
    9 52998934 10/04/2020 17:00 04/04/2020 00:01
    10 52998934 15/04/2020 15:51 10/04/2020 17:01

    Et voici la requête que j'ai faite pour Postgres qui n'est pas fonctionnelle : 

    with recursive deb(id, id_groupe, DATE_DEBUT_REELLE, DATE_FIN_REELLE, test, cycle) as ( -- commencer à partir des indispos inopinées dans la période d'étude select dgi.ID , dgi.ID_GROUPE , dgi.DATE_DEBUT_REELLE , dgi.DATE_FIN_REELLE , ARRAY[dgi.id::text] AS test , false as cycle FROM DATA_GROUPE_INDISPO_kd_kp dgi WHERE ID_INDISPONIBILITE_TYPE NOT IN (1,2,36) -- 1 = prévue s + 1 , 2 = prévue j + 1, 36 = modulation union all select dgif.ID , dgif.ID_GROUPE , dgif.DATE_DEBUT_REELLE , dgif.DATE_FIN_REELLE , prior.test || dgif.id::text , dgif.id::text=ANY(prior.test) FROM DATA_GROUPE_INDISPO_kd_kp dgif JOIN deb prior on ( prior.id = dgif.id ) where dgif.DATE_FIN_REELLE - dgif.DATE_DEBUT_REELLE <= interval '1 day' AND dgif.ID_INDISPONIBILITE_TYPE IN (1,2) -- on ne prend que les indispos prévues à la suite d'une indispo mère non prévue; and cycle =false ) select * from deb where cycle = false ;

    Qui ne retourne que la première ligne : 

    ID ID_GROUPE DATE_DEBUT_REELLE DATE_FIN_REELLE TEST CYCLE
    52998934 1 27/03/2020 00:00 27/03/2020 00:00 {1} false

    Merci par avance de votre aide !

    Thomas

    -
    Edité par Thomas-Treks 11 février 2021 à 18:12:27

    • Partager sur Facebook
    • Partager sur Twitter

    Problème de requête récursive Oracle vers Postgres

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown