Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/04/2011, 20h42   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 91
Points : 13
Points : 13
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 :
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...
quake3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 08h33   #2
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
tu peux utiliser une fonction d'aggrégation

Code :
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 :
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
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 09h03   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Utilisez First/Last sous sa forme de fonction d’agrégation : KEEP (DENSE_RANK LAST ORDER BY ...)
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/04/2011, 13h39   #4
Candidat au titre de Membre du Club
 
Inscription : septembre 2009
Messages : 91
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 91
Points : 13
Points : 13
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!
quake3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h40.


 
 
 
 
Partenaires

Hébergement Web