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 131
    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 131
    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 493
    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 493
    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 : 295
Taille : 8,6 Ko

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 131
    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 131
    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 166
    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 166
    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
    21 980
    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 : 21 980
    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 493
    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 493
    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 : 300
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, 12h26
  2. Une requete SQL unpeux difficile !!
    Par nil dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/03/2004, 13h32
  3. Requête difficile......
    Par HPJ dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/01/2004, 20h14
  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, 14h51
  5. Script assez difficile avec random
    Par LFC dans le forum Requêtes
    Réponses: 6
    Dernier message: 01/08/2003, 19h02

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