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

SQL Oracle Discussion :

Résultats regroupés en évitant les doublons [11g]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Par défaut Résultats regroupés en évitant les doublons
    Pourriez-vous m'aider concernant l'élaboration d'une requête SQL sur une base de données ?

    Le contexte est le suivant: mon système gère des contrats liés à des activités (1 contrat peut être lié à 1 ou plusieurs activités). Chaque activité est lié à un "domaine"

    Voici la structure des tables de ma base de données:

    Table CONTRAT

    Id_CONTRAT Titre_CONTRAT
    1 Contrat 1
    2 Contrat 2
    3 Contrat 3
    4 Contrat 4

    Table DOMAINE

    Id_DOMAINE Titre_DOMAINE
    2 Domaine 2
    3 Domaine 3
    5 Domaine 5
    8 Domaine 8


    Table ACTIVITE

    Id_ACTIVITE Titre_ACTIVITE Id_DOMAINE
    118 Activite 118 2
    266 Activite 266 2
    269 Activite 269 3
    272 Activite 272 3
    275 Activite 275 5
    283 Activite 283 8
    301 Activite 301 8


    Table de liaison LIEN_CONTRAT_ACTIVITE

    Id_CONTRAT Id_ACTIVITE
    1 118
    2 266
    2 269
    3 272
    4 275
    4 283
    4 301

    J'ai créé cette vue: VUE_CONTRAT_ACTIVITE_DOMAINE en effectuant la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.Id_CONTRAT,
    a.Id_ACTIVITE,
    a.Id_DOMAINE
    FROM LIEN_CONTRAT_ACTIVITE c, activite a
    WHERE c.Id_CONTRAT = a.Id_CONTRAT

    Id_CONTRAT Id_ACTIVITE Id_DOMAINE
    1 118 2
    2 266 2
    2 269 3
    3 272 3
    4 275 5
    4 283 8
    4 301 8

    J'ai effectué cette requête afin d'obtenir tous les domaines obtenus par contrat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT Id_CONTRAT,
        SUBSTR(SYS_CONNECT_BY_PATH(Id_DOMAINE,';'),2) Id_DOMAINE
      FROM
        (SELECT Id_DOMAINE,
          Id_CONTRAT,
          COUNT(*) OVER ( partition BY Id_CONTRAT ) im,
          ROW_NUMBER () OVER ( partition BY Id_CONTRAT order by Id_DOMAINE) seq
        FROM VUE_CONTRAT_ACTIVITE_DOMAINE
        WHERE Id_CONTRAT IS NOT NULL
        )
      WHERE seq               =im
        START WITH seq        =1
        CONNECT BY prior seq+1=seq
      AND prior Id_CONTRAT         =Id_CONTRAT

    Titre_CONTRAT Id_DOMAINE
    Contrat 1 2
    Contrat 2 2;3
    Contrat 3 3
    Contrat 4 2;8;8

    Cependant je souhaiterais pour la dernière ligne que le système affiche 2;8 et non pas 2;8;8 c'est-à-dire qu'il n'affiche q'une fois le domaine même si celui-ci est le même pour plusieurs activités.

    Pourriez-vous me dire comment faire?

    Merci d'avance pour votre aide.

    Cordialement

  2. #2
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Par défaut
    Bonjour,

    J'ai l'impression que vous vous compliquez la vie en voulant utiliser la fonction sys_connect_by_path et une requête hiérarchique.

    Est-ce que la fonction LISTAGG ne pourrait pas vous être plus utile ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_contrat, LISTAGG(id_domaine, ';') WITHIN GROUP (ORDER BY id_domaine) AS id_domaine
    FROM VUE_CONTRAT_ACTIVITE_DOMAINE
    WHERE Id_CONTRAT IS NOT NULL
    GROUP BY id_contrat

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Par défaut
    Bonjour, Merci pour la réponse.

    Effectivement le résultat est identique. Merci beaucoup pour cette simplification.

    Par contre sauriez-vous comment résoudre mon problème initial (ne pas afficher les doublons s'ils existent) ?

  4. #4
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,
    A vue de nez, je dirais qqchose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT id_contrat, LISTAGG(id_domaine, ';') WITHIN GROUP (ORDER BY id_domaine) AS id_domaine
    FROM
       (SELECT id_contrat, id_domaine 
         FROM VUE_CONTRAT_ACTIVITE_DOMAINE
          WHERE Id_CONTRAT IS NOT NULL
        GROUP BY id_contrat, id_domaine)
    GROUP BY id_contrat
    @+

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Par défaut
    Merci beaucoup, cela fonctionne. Par contre j'essaie de créer un vue sur base de cette query mais cela ne fonctionne pas, cela me marque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Error(s) parsing SQL:
    Unexpected token near *!* in the following:
    SELECT id_contrat, LISTAGG(id_domaine, ';') WITHIN *!* GROUP (ORDER BY id_domaine) AS id_domaine
    Pourriez-vous me dire pourquoi et m'aider à résoudre le problème

    Merci d'avance

  6. #6
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Salut,
    Quel est le statement exact utilisé pour créer la vue?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/07/2012, 11h25
  2. [WD11] Remplir une liste en évitant les doublons
    Par hanitax dans le forum WinDev
    Réponses: 0
    Dernier message: 08/01/2012, 16h16
  3. Mise à jour d'enregistrement en évitant les doublons
    Par michel67000 dans le forum Requêtes
    Réponses: 9
    Dernier message: 09/11/2010, 23h12
  4. Recherche de valeur évitant les doublons
    Par Jimy6000 dans le forum Excel
    Réponses: 3
    Dernier message: 04/04/2010, 11h21
  5. Regroupement évitant les doublons
    Par vinz945 dans le forum Deski
    Réponses: 1
    Dernier message: 30/04/2008, 13h11

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