IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

D�veloppement SQL Server Discussion :

Requ�te difficile � nommer


Sujet :

D�veloppement SQL Server

  1. #1
    Membre habitu�
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Par d�faut Requ�te difficile � nommer
    Bonjour � tous,

    Je suis administrateur fonctionnelle d'une application financi�re et je souhaite avoir une extraction sur des donn�es g�r�s sur SQL Server 2016.
    Voici les donn�es de la table Processus
    ID;CodeProcessus;LibelleProcessus;PereProcessus
    1;ARE;Libelle ARE;null
    2;DSF;Libelle DSF;ARE
    3;VDFG;Libelle VDFG;null
    4;CVD;Libelle CVD;VDFG
    5;CSX;Libelle CSX;ARE
    6;HJK;Libelle HJK;ARE
    Et je veux avoir cette restitution :
    1;ARE;Libelle ARE;;;
    1;ARE;Libelle ARE;5;CSX;Libelle CSX
    1;ARE;Libelle ARE;2;DSF;Libelle DSF
    1;ARE;Libelle ARE;6;HJK;Libelle HJK
    3;VDFG;Libelle VDFG;;;
    3;VDFG;Libelle VDFG;4;CVD;Libelle CVD
    Pouvez-vous m'assister pour obtenir la restitution ?
    Merci

  2. #2
    Mod�rateur
    Avatar de al1_24
    Homme Profil pro
    Retrait�
    Inscrit en
    Mai 2002
    Messages
    9 136
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 64
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Retrait�
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par d�faut
    Bonjour,

    S'il n'y a qu'un seul niveau d'imbrication comme dans ton exemple, une simple auto-jointure externe devrait r�soudre le probl�me.

    Qu'as-tu d�j� test� comme requ�te(s) ?
    O� rencontres-tu un probl�me ?
    • Une erreur d'ex�cution ? Quel est le message associ� ?
    • Un r�sultat erron� ? Quel est le r�sultat obtenu ?


    Pour rappel : Les jointures - operateur JOIN - NATURAL, INNER, OUTER, CROSS, UNION - �qui, non �qui, in�qui et th�ta jointures - Arbre de jointure
    Mod�rateur Langage SQL
    R�gles du forum Langage SQL � lire par tous, N'h�sitez pas � consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une r�ponse vous a aid� � r�soudre votre probl�me, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un probl�me expos� sans mentionner les tentatives de r�solution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail � sa place... et ne donne pas envie d'y r�pondre.

  3. #3
    Membre habitu�
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Par d�faut
    C'est r�solu simplement avec un UNION.

    Merci

  4. #4
    Mod�rateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activit� : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par d�faut
    Une union seule ne peut pas produire le r�sultat attendu tel qu'exprim� dans la demande initiale...


    Voici une possibilit�

    Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    with tab (ID, CodeProcessus, LibelleProcessus, PereProcessus) as 
        (select 1, 'ARE',  'Libelle ARE',  null    union all
         select 2, 'DSF',  'Libelle DSF', 'ARE'    union all
         select 3, 'VDFG', 'Libelle VDFG', null    union all
         select 4, 'CVD',  'Libelle CVD', 'VDFG'   union all
         select 5, 'CSX',  'Libelle CSX', 'ARE'    union all
         select 6, 'HJK',  'Libelle HJK', 'ARE'
        )
    select T1.ID
         , T1.CodeProcessus
         , T1.LibelleProcessus
         , T2.CodeProcessus
         , T2.LibelleProcessus
    from            tab as T1
    inner join tab as T2
        on T2.PereProcessus = T1.CodeProcessus
    where T1.PereProcessus is null
    union all
    select T1.ID
         , T1.CodeProcessus
         , T1.LibelleProcessus
         , ' '
         , ' '
    from            tab as T1  
    where T1.PereProcessus is null  
    order by T1.CodeProcessus
           , T2.CodeProcessus


    R�sultat :

    Nom : Sans titre.png
Affichages : 324
Taille : 8,6 Ko

  5. #5
    Mod�rateur
    Avatar de al1_24
    Homme Profil pro
    Retrait�
    Inscrit en
    Mai 2002
    Messages
    9 136
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 64
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Retrait�
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par d�faut
    Une autre possibilit�, sur la base du jeu d'essai :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select  per.Id
        ,   per.CodeProcessus
        ,   per.LibelleProcessus
        ,   fls.Id
        ,   fls.CodeProcessus
        ,   fls.LibelleProcessus
    from    matable as  per
        left join
            matable as  fls
            on  per.PereProcessus = fls.CodeProcessus
    where   per.PereProcessus   is null
    order by per.CodeProcessus
        ,   fls.CodeProcessus
    Mod�rateur Langage SQL
    R�gles du forum Langage SQL � lire par tous, N'h�sitez pas � consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une r�ponse vous a aid� � r�soudre votre probl�me, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un probl�me expos� sans mentionner les tentatives de r�solution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail � sa place... et ne donne pas envie d'y r�pondre.

  6. #6
    Membre Expert
    Homme Profil pro
    D�veloppeur Oracle
    Inscrit en
    D�cembre 2019
    Messages
    1 176
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : D�veloppeur Oracle

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 1 176
    Par d�faut
    C'est l� qu'on voit que SQL Server est souvent � la ramasse en terme de fonctionnalit� de requ�tage par rapport � Oracle. Une seule requ�te sur la table concern�e suffit dans Oracle:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    select connect_by_root id pereid,
           connect_by_root codeprocessus pereprocessus, 
           connect_by_root libelleprocessus libelleperprocessus, 
           nullif(id,connect_by_root id) id, 
           nullif(libelleprocessus, connect_by_root libelleprocessus) libelleprocessus
     from t
    start with pereprocessus is null
    connect by prior codeprocessus = pereprocessus;

  7. #7
    R�dacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de donn�es / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Expert bases de donn�es / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par d�faut
    Citation Envoy� par vanagreg Voir le message
    C'est l� qu'on voit que SQL Server est souvent � la ramasse en terme de fonctionnalit� de requ�tage par rapport � Oracle. Une seule requ�te sur la table concern�e suffit dans Oracle:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    select connect_by_root id pereid,
           connect_by_root codeprocessus pereprocessus, 
           connect_by_root libelleprocessus libelleperprocessus, 
           nullif(id,connect_by_root id) id, 
           nullif(libelleprocessus, connect_by_root libelleprocessus) libelleprocessus
     from t
    start with pereprocessus is null
    connect by prior codeprocessus = pereprocessus;

    Le probl�me c'est que cela n'est pas du tout dans la norme SQL et qu'en plus cela ne r�sout pas tous les cas de figure, notamment les parcours de graphe, ni les arbres imbriqu�s... !

    A +
    Fr�d�ric Brouard - SQLpro - ARCHITECTE DE DONN�ES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : mod�lisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Mod�rateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activit� : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par d�faut
    Citation Envoy� par al1_24 Voir le message
    Une autre possibilit�, sur la base du jeu d'essai :
    Cette requ�te ne produit qu'une partie du r�sultat attendu

    Nom : Sans titre.png
Affichages : 329
Taille : 19,4 Ko

  9. #9
    Mod�rateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par d�faut
    Citation Envoy� par vanagreg Voir le message
    C'est l� qu'on voit que SQL Server est souvent � la ramasse en terme de fonctionnalit� de requ�tage par rapport � Oracle. Une seule requ�te sur la table concern�e suffit dans Oracle
    Ce n'est pas super complexe de transposer avec la version norm�e de la requ�te r�cursive (un peu plus verbeux certes) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    with cte_recurs (ID, CodeProcessus, LibelleProcessus, CodeProcessusPere, ID_Fils, CodeProcessus_Fils, LibelleProcessus_Fils) as
    (
    select ID, CodeProcessus, LibelleProcessus, CodeProcessus
         , cast(null as integer)
         , cast(null as char(3))
         , cast(null as char(11))
      from MaTable
     where PereProcessus is null
     union all
    select c.ID, c.CodeProcessus, c.LibelleProcessus, t.CodeProcessus
         , t.ID, t.CodeProcessus, t.LibelleProcessus
      from MaTable    t
      join cte_recurs c on c.CodeProcessusPere = t.PereProcessus
    )
    select ID, CodeProcessus, LibelleProcessus
         , ID_Fils, CodeProcessus_Fils, LibelleProcessus_Fils
      from cte_recurs;

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Requ�te] Difficile (impossible ?) avec des dates
    Par starch dans le forum MS SQL Server
    R�ponses: 3
    Dernier message: 06/04/2004, 11h26
  2. Une requete SQL unpeux difficile !!
    Par nil dans le forum Bases de donn�es
    R�ponses: 5
    Dernier message: 09/03/2004, 12h32
  3. Requ�te difficile......
    Par HPJ dans le forum Langage SQL
    R�ponses: 7
    Dernier message: 22/01/2004, 19h14
  4. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requ�tes
    R�ponses: 5
    Dernier message: 08/09/2003, 13h51
  5. Script assez difficile avec random
    Par LFC dans le forum Requ�tes
    R�ponses: 6
    Dernier message: 01/08/2003, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo