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

Oracle Discussion :

Eliminer la redondance...


Sujet :

Oracle

  1. #1
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut Eliminer la redondance...
    Salut,
    J'aimerais savoir si dans le cas de ma requête, il serait possible d'éliminer les champs redondants, merci.
    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
    18
    19
    	select  A.N_ACTION_ID as actionIdQry,
    			A.S_CODE as codeQry,
    			A.S_DESC as descriptionQry,
    			C.S_VALUE as objectiveQry,
    			E.S_DESC as indicatorqry
     
    	from
    	   		T_ACTION A,
    	   		T_ACTION_MP B,
    			T_OBJECTIVE C,
    			T_OBJECTIVE_INDICATOR D,
    			T_INDICATOR E
     
    	where
    	   		A.N_ACTION_ID = B.N_ACTION_ID
    			and B.N_ACTION_MP_ID = C.N_ACTION_MP_ID
    			and C.N_OBJECTIVE_ID = D.N_OBJECTIVE_ID
    			and D.N_INDICATOR_ID = E.N_INDICATOR_ID
    			and B.N_MP_ID = 1
    Voici le résultat :
    actionIdQry | codeQry | descriptionQry | objectiveQry | indicatorqry
    -------------------------------------------------------------------------------
    1 | 123 | blabla | objectif 1 | indic 1
    1 | 123 | blabla | objectif 1 | indic 2

    Et le résultat espéré :
    actionIdQry | codeQry | descriptionQry | objectiveQry | indicatorqry
    -------------------------------------------------------------------------------
    1 | 123 | blabla | objectif 1 | indic 1
    _|____|______|________| indic 2

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Rajoute un DISTINCT.
    Attention le distinct nécessite un tri en mémoire de toutes les lignes et est donc consommateur.
    Toujours vérifier si les doublons ne sont pas générés par un problème de requete (mauvaise jointure, etc..)

  3. #3
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut
    J'ai essayé le distinct mais ça ne fonctionne pas... J'ai 2 lignes presque identique mais pas exactement... 1 champ change, le distinct serait nickel si mes 2 lignes étaient strictement identiques...

  4. #4
    Membre éprouvé Avatar de Process Linux
    Inscrit en
    Septembre 2003
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 136
    Par défaut
    voilà, j'ai bidouillé un peu , voici peut être une requête qui peut répondre à ton besoin :

    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
    18
    19
    20
     
    select  A.N_ACTION_ID as actionIdQry, 
             decode(rownum,1,A.S_CODE,'_______') as codeQry, 
             decode(rownum,1,A.S_DESC,'_______') as descriptionQry, 
             decode (rownum,1,C.S_VALUE,'_______') as objectiveQry, 
             decode (rownum,1,E.S_DESC,'________') as indicatorqry 
     
       from 
                T_ACTION A, 
                T_ACTION_MP B, 
             T_OBJECTIVE C, 
             T_OBJECTIVE_INDICATOR D, 
             T_INDICATOR E 
     
       where 
                A.N_ACTION_ID = B.N_ACTION_ID 
             and B.N_ACTION_MP_ID = C.N_ACTION_MP_ID 
             and C.N_OBJECTIVE_ID = D.N_OBJECTIVE_ID 
             and D.N_INDICATOR_ID = E.N_INDICATOR_ID 
             and B.N_MP_ID = 1
    cela doit répondre à ce besoin.

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    J'ai compris ce que tu voulais..

    Le décode avec le rownum ne marchera pas car tu n'auras les premierères colonnes que sur la première ligne que les champs soit distinct ou pas.

    Tu es en quelle version ?

  6. #6
    Membre éprouvé Avatar de Process Linux
    Inscrit en
    Septembre 2003
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 136
    Par défaut
    J'ai testé cette requête dans une BD oracle 9i , ca marche.
    je ne sais pas si ca peut marcher pour les 8i , il faut tester

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Process Linux
    J'ai testé cette requête dans une BD oracle 9i , ca marche.
    je ne sais pas si ca peut marcher pour les 8i , il faut tester
    C'est étonnant, tu testes le rownum = 1, c'est à dire que la PREMIERE ligne tu auras les renseignements, toutes les lignes suivantes auront le '- - - -' !!
    en gros, avec ton code

    actionIdQry | codeQry | descriptionQry | objectiveQry | indicatorqry
    -------------------------------------------------------------------------------
    1 | 123 | blabla | objectif 1 | indic 1
    1|____|______|________| indic 2
    2|____|______|________| indic 1
    2|____|______|________| indic 2
    3|____|______|________| indic 2

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    J'ai fais un truc avec les fonctions analytiques, mais je n'en utilise jamais.. donc c'est peut être une abhération côté programmation. A voir.

    Explication : ON teste si les champs de la ligne précédente (avec CONCATénation) est identique pour chaque champ
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    SELECT DECODE( lag(a.n_action_id || '#' || a.s_code || '#' || a.s_desc || '#' || c.s_value, 1) 
    				OVER(PARTITION BY a.n_action_id, a.s_code, a.s_desc, c.s_value
    						ORDER BY a.n_action_id, a.s_code, a.s_desc, c.s_value), 
    		 		a.n_action_id || '#' || a.s_code || '#' || a.s_desc || '#' || c.s_value,
    				'---', a.n_action_id) AS actionidqry, 
           DECODE( lag(a.n_action_id || '#' || a.s_code || '#' || a.s_desc || '#' || c.s_value, 1) 
    				OVER(PARTITION BY a.n_action_id, a.s_code, a.s_desc, c.s_value
    						ORDER BY a.n_action_id, a.s_code, a.s_desc, c.s_value), 
    		 		a.n_action_id || '#' || a.s_code || '#' || a.s_desc || '#' || c.s_value,
    				'---', a.s_code) AS codeqry, 
           DECODE( lag(a.n_action_id || '#' || a.s_code || '#' || a.s_desc || '#' || c.s_value, 1) 
    				OVER(PARTITION BY a.n_action_id, a.s_code, a.s_desc, c.s_value
    						ORDER BY a.n_action_id, a.s_code, a.s_desc, c.s_value), 
    		 		a.n_action_id || '#' || a.s_code || '#' || a.s_desc || '#' || c.s_value,
    				'---', a.s_desc) AS descriptionqry, 
           DECODE( lag(a.n_action_id || '#' || a.s_code || '#' || a.s_desc || '#' || c.s_value, 1) 
    				OVER(PARTITION BY a.n_action_id, a.s_code, a.s_desc, c.s_value
    						ORDER BY a.n_action_id, a.s_code, a.s_desc, c.s_value), 
    		 		a.n_action_id || '#' || a.s_code || '#' || a.s_desc || '#' || c.s_value,
    				'---', c.s_value) AS objectiveqry, 
           e.s_desc 
    FROM T_ACTION A, 
    	T_ACTION_MP B, 
    	T_OBJECTIVE C, 
    	T_OBJECTIVE_INDICATOR D, 
    	T_INDICATOR E 
    WHERE a.n_action_id = b.n_action_id 
    AND b.n_action_mp_id = c.n_action_mp_id 
    AND c.n_objective_id = d.n_objective_id 
    AND d.n_indicator_id = e.n_indicator_id 
    AND b.n_mp_id = 1
    ORDER BY a.n_action_id, a.s_code, a.s_desc, c.s_value
    J'ai mis comme séparateur le caractère '#', mais si ce caractère est utilisé dans l'un des champs, faut le remplacer par autre chose genre CHR(10), du moins un truc qui n'est jamais utilisé dans l'un des champs

  9. #9
    Membre éprouvé Avatar de Process Linux
    Inscrit en
    Septembre 2003
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 136
    Par défaut
    oui , il y a toujours un problème de répétition , je me suis concentrer sur la redondance et j'ai oubliè le contenu de la requête.
    , eh oui , il faut faire plus que la requête simple que j'ai envoyé

  10. #10
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut
    Etrange mais ça fonctionne, ça me ressort pile poil ce que je recherche... Comprends pas ou est le problème...
    Merci Process Linux...

  11. #11
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    je pense qu'un les break on report sur les colonnes en question sous SQL*Plus régle le problème TRES simplement

  12. #12
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut
    La commande BREAK n'est pas reconnue par TOAD, je ne peux donc l'utiliser... Quel est le point faible de la 1ère solution de Process Linux???
    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
    18
    19
    select  A.N_ACTION_ID as actionIdQry, 
             decode(rownum,1,A.S_CODE,'_______') as codeQry, 
             decode(rownum,1,A.S_DESC,'_______') as descriptionQry, 
             decode (rownum,1,C.S_VALUE,'_______') as objectiveQry, 
             decode (rownum,1,E.S_DESC,'________') as indicatorqry 
     
       from 
                T_ACTION A, 
                T_ACTION_MP B, 
             T_OBJECTIVE C, 
             T_OBJECTIVE_INDICATOR D, 
             T_INDICATOR E 
     
       where 
                A.N_ACTION_ID = B.N_ACTION_ID 
             and B.N_ACTION_MP_ID = C.N_ACTION_MP_ID 
             and C.N_OBJECTIVE_ID = D.N_OBJECTIVE_ID 
             and D.N_INDICATOR_ID = E.N_INDICATOR_ID 
             and B.N_MP_ID = 1
    Chez moi, ceci retourne ce que je cherche...

  13. #13
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut
    J'ai ajouté une ou 2 données de plus et je viens de comprendre... La solution proposée ne retourne que la première ligne complète, pour les autres, il ne gère pas...

  14. #14
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Dans ce cas, la fonction analytique LEAD devrait également t'aider

    Ceci dit, il est important de rappeler que le SQL n'est pas un langage fait pour "l'esthétique". Les problèmes de présentation doivent être traité par l'outil qui permet d'afficher le résultat

  15. #15
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut
    ok, merci... D'autre part, je viens de me rendre compte que ma solution posait un problème de jointure... Et Toad, que je suis contraint d'utiliser ne reconnait pas outer, ni join, d'ailleurs...

Discussions similaires

  1. Eliminer la redondance dans l'affichage
    Par kiwilicious dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 25/04/2014, 20h14
  2. eliminer la redondance dans le résultat
    Par Wim88 dans le forum Général Java
    Réponses: 3
    Dernier message: 06/03/2014, 11h08
  3. Eliminer la redondance de la configuration
    Par Baptiste Wicht dans le forum Maven
    Réponses: 1
    Dernier message: 11/02/2010, 13h52
  4. Réponses: 4
    Dernier message: 11/06/2007, 17h49
  5. [HERITAGE] Redondance ou pas redondance ???
    Par cyrillus76 dans le forum Schéma
    Réponses: 1
    Dernier message: 11/06/2003, 09h46

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