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 :

Requete Oracle suppression de doublons de jointures


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut Requete Oracle suppression de doublons de jointures
    Bonjour,

    J'ai un problème de requête sur une base oracle, j'y suis depuis plus d'une semaine et j'ai plus d'idées

    J'ai donc une base de donnée avec 3 tables (MA,ONN et SETUP) tels que :

    Table MA contient les champs => PROPRIETAIRE(string), CATEGORIE(string),BAC(int), et d'autres champs pas importants.

    TABLE ONN contient les champs => USERID(string),CONNEXION(date), STATUS(int) et d'autres champs pas importants.

    TABLE SETUP contient les champs => ID(string), NOM(string), PASSWORD(string) et d'autres champs pas importants.

    Les champs qui correspondent :
    USERID = ID
    PROPRIETAIRE = NOM

    Je veux donc récupérer l'id, le nom, la dernière date de connexion, la différence entre la date de connexion et SYSDATE, et le status.

    Le problème est que pour le même ID il y a plusieurs dates de connexion, et aussi plusieurs STATUS donc plusieurs lignes. Je ne veux que la dernière des dates de connexion mais j'obtiens des doublons quand je rajoute STATUS dans mon SELECT.

    Voici ma requête pour que cela soit plus simple à comprendre (PS:mon distinct ne sert à rien):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT MA.PROPRIETAIRE, ONN.USERID, TO_CHAR(MAX(ONN.CONNEXION), 'dd/mm/yyyy') AS LAST_CONNEXION, 
    TO_DATE(SYSDATE) - TO_DATE(TO_CHAR(MAX(ONN.CONNEXION))) AS DIFFERENCE, STATUS
    FROM MA INNER JOIN
    SETUP ON MA.PROPRIETAIRE= SETUP.NOM INNER JOIN
    ONN ON ONN.USERID = SETUP.ID
    WHERE CATEGORIE='CHEF'
    AND SETUP.ID != 'JPL43'
    AND BAC = 0
    GROUP BY MA.PROPRIETAIRE, ONN.USERID, STATUS
    ORDER BY PROPRIETAIRE ASC

    Si vous voulez plus de précisions je réponds généralement assez vite.

    Merci de votre aide parce que la je désespère...

  2. #2
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    tu peux utiliser une fonction d'aggrégation

    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
    SELECT DISTINCT MA.PROPRIETAIRE
                  , ONN.USERID
                  , TO_CHAR(LAST_CNX, 'dd/mm/yyyy') AS LAST_CONNEXION
                  , SYSDATE - LAST_CNX AS DIFFERENCE
                  , STATUS
    FROM MA INNER JOIN SETUP 
      ON MA.PROPRIETAIRE = SETUP.NOM INNER JOIN
         ( select distinct USERID
                , max(CONNEXION) over (partition by user_id) LAST_CNX
                , status			
           from  ONN ) DV_ONN  
      ON DV_ONN.USERID = SETUP.ID
    WHERE CATEGORIE='CHEF'
    AND SETUP.ID != 'JPL43'
    AND BAC = 0
    ORDER BY PROPRIETAIRE ASC
    Mais ça va sortir autant de ligne que de "STATUS" pour chaque "USERID".

    Une autre solution (si tu veux le "STATUS") à la dernière connexion est d'utiliser une fonction de ranking


    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
    SELECT DISTINCT MA.PROPRIETAIRE
                  , ONN.USERID
                  , TO_CHAR(CONNEXION, 'dd/mm/yyyy') AS LAST_CONNEXION
                  , SYSDATE - CONNEXION AS DIFFERENCE
                  , STATUS
    FROM MA INNER JOIN SETUP 
      ON MA.PROPRIETAIRE = SETUP.NOM INNER JOIN
         ( select distinct USERID
                , rank() over (partition by user_id order by CONNEXION desc) rk
                , status			
                , CONNEXION
           from  ONN ) DV_ONN  
      ON DV_ONN.USERID = SETUP.ID
    WHERE CATEGORIE='CHEF'
    AND SETUP.ID != 'JPL43'
    AND BAC = 0
    AND DV_ONN.RK=1
    ORDER BY PROPRIETAIRE ASC

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Utilisez First/Last sous sa forme de fonction d’agrégation : KEEP (DENSE_RANK LAST ORDER BY ...)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Merci beaucoup, mais j'y suis arrivé en utilisant une requête imbriquée avec MAX et l'utilisation de : HAVING COUNT(champs) >1 ce qui élimine les doublons absolus !

    Merci tout de même d'avoir pris le temps de jetter un œil!

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

Discussions similaires

  1. [AC-2010] Requete suppression de doublon
    Par pierre031 dans le forum Access
    Réponses: 7
    Dernier message: 12/03/2014, 12h10
  2. Requete suppression de doublons
    Par devlm dans le forum Requêtes
    Réponses: 1
    Dernier message: 29/10/2012, 16h50
  3. Oracle 10.2 suppression de doublons
    Par ducho dans le forum SQL
    Réponses: 2
    Dernier message: 16/03/2010, 11h45
  4. [LG]Suppression de doublons
    Par moustique31 dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2003, 21h03
  5. Requete de comptage de doublons spéciale
    Par COliveOnTheNet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/09/2003, 10h11

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