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 :

Requêtes imbriquées Débutant


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Requêtes imbriquées Débutant
    Bonjour,

    Voici mon cas :

    TABLE 1 et TABLE 2
    NOM RESULTID
    ANNEE LIB
    Debut ....
    Fin
    RESULTID
    ...

    Mon but est d'obtenir tous les (NOM,ANNEE,Debut) en éliminant ceux qui n'ont pas de bons résultats.
    Un couple (NOM,ANNEE) ayant plusieurs RESULTATS, je ne veux que le dernier effectué.
    J'ai donc fais une première requête :

    SELECT NOM, ANNEE, MAX(Debut)
    FROM TABLE1
    GROUP BY NOM, ANNEE

    Cela me donne bien les bons triplets J'ai donc plein de lignes NOM,ANNEE,Debut

    Ensuite j'aimerai ajouter d'autres informations de la table 1 et de la table 2 mais là j'ai un souci : comment faire la jointure sur tous ces éléments ?

    Par exemple :

    SELECT NOM, ANNEE, Debut, LIB, etc.
    FROM TABLE1, TABLE2
    ....

    Merci pour votre aide

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    J'ai du mal à voir la structure de tes tables. Et si tu leur donnais un nom explicite ce serait plus lisible.

    A quoi correspondent 'Debut' et 'Fin' ?

    RESULTID est-il une clé étrangère dans Table 1 correspondant à RESULTID de Table 2 ?

    Enfin bref, sans structure plus explicite, difficile de te répondre.

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu as la fonction de groupement KEEP (DENSE_RANK..

    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
    WITH t AS(SELECT ROWNUM num, ROUND(TRUNC(SYSDATE) + ROWNUM *5 / 24) AS dte, CHR(64+ROWNUM) lib1, CHR(64+ROWNUM) || CHR(64+ROWNUM) lib2 FROM user_tables
            WHERE ROWNUM < 20
            )
    SELECT dte, MAX(num), 
          MAX(lib1) KEEP (DENSE_RANK LAST ORDER BY num) AS lib1,
          MAX(lib2) KEEP (DENSE_RANK LAST ORDER BY num) AS lib2
    FROM t
    GROUP BY dte
     
    DTE	MAX(NUM)	LIB1	LIB2
    03/07/2008	2	B	BB
    04/07/2008	7	G	GG
    05/07/2008	11	K	KK
    06/07/2008	16	P	PP
    07/07/2008	19	S	SS

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Effectivement ce n'est pas très clair

    TABLE1
    NOM (clé)
    ANNEE
    Date_DEBUT
    Date_FIN
    RESULTID (pas de clé étrangère)
    ...

    TABLE2
    RESULTID (clé)
    LIBELLE
    ...

    Cette structure m'est imposée, même si elle n'est pas très top.

    Je récupère à l'heure actuelle un dataset de plusieurs centaines de lignes et j'aimerai n'avoir que la dernière ligne d'un triplet NOM/ANNEE/Date_Debut, c'est à dire celle où Date_Debut est la plus récente pour chaque année.

    J'espère être plus clair.

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

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Donc keep dense_rank fera l'affaire.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci McM

    Je suis en train d'essayer
    Je vous tiens au courant

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Aie. Ca ne fonctionne pas :

    La requête suivante fonctionne seule (elle me permet si j'ai bien compris de remonter l'ensemble de mes infos sans pouvoir filtrer sur ma date )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT NOM, ANNEE, ...
    FROM TABLE1
    Cela marche évidement mais ensuite si j'utilise (exemple simple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    With T AS(
    SELECT NOM, ANNEE, ...
    FROM TABLE1)
    SELECT NOM FROM T
    J'ai le messge : SQL statement doesn't return rows

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

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Version de la base ?

    Sinon, oublie le WITH, c'est pour avoir une vue de données.
    C'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT dte, MAX(num), 
          MAX(lib1) KEEP (DENSE_RANK LAST ORDER BY num) AS lib1,
          MAX(lib2) KEEP (DENSE_RANK LAST ORDER BY num) AS lib2
    FROM (SELECT ROWNUM num, ROUND(TRUNC(SYSDATE) + ROWNUM *5 / 24) AS dte, CHR(64+ROWNUM) lib1, CHR(64+ROWNUM) || CHR(64+ROWNUM) lib2 FROM user_tables
            WHERE ROWNUM < 20
            )
    GROUP BY dte
    Dans ton cas pour le KEEP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT NOM, ANNEE, 
    max(date_deb), max(lib) keep (DENSE_RANK last order by date_deb) as lib,
    max(col44) keep (DENSE_RANK last order by date_deb) as col44, etc...
    FROM TABLE1
    GROUP BY nom, annee

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci McM pour cette réponse.
    Si j'essaye d'utiliser le KEEP et en simplifiant (c'est à dire que cela revient à rechercher la dernière tentative de <NOM> pour une <ANNEE> donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT NOM, ANNEE, RESULT
    MAX(Date_Debut) KEEP(DENSE_RANK LAST ORDER BY Date_Debut)
    FROM TABLE1
    GROUP BY NOM, ANNEE, RESULT
    J'obtiens la même réponse qu'avec MAX(Date_Debut) tout seul (voir en dessous). Je vois bien que mon utilisation du KEEP n'est pas bonne mais je n'arrive pas à le gérer.
    J'aimerai donc obtenir uniquement les lignes 3,4 et 5 de mon exemple ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    USER1     2007      01/02/2007     Bien
    USER1     2007      01/06/2007     Moyen
    USER1     2007      30/06/2007     Bien
    USER1     2008      14/05/2008     Bien
    USER2     2008      06/03/2008     TB
    ...

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je crois que j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT NOM,ANNEE, Date_Debut
    FROM TABLE1
    WHERE Date_Debut IN
       (SELECT MAX(heure_debut)
        FROM TABLE1
        GROUP BY NOM,ANNEE)
    A priori cela me retourne les bons résultats (cf. message précédent)
    Peut être y-a-t-il plus 'rigoureux', 'efficace' ?

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu n'as pas compris le keep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NOM, ANNEE, max(debut), 
    MAX(RESULT) KEEP(DENSE_RANK LAST ORDER BY Date_Debut)
    FROM TABLE1
    GROUP BY NOM, ANNEE
    le MAX sur result ne sert à rien, c'est juste qu'il faut une fonction de groupe, on pourrait mettre min, moy, etc.. le résultat sera le même

  12. #12
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par McM Voir le message
    Tu n'as pas compris le keep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NOM, ANNEE, max(debut), 
    MAX(RESULT) KEEP(DENSE_RANK LAST ORDER BY Date_Debut)
    FROM TABLE1
    GROUP BY NOM, ANNEE
    le MAX sur result ne sert à rien, c'est juste qu'il faut une fonction de groupe, on pourrait mettre min, moy, etc.. le résultat sera le même
    Dans ce cas particulier peut être mais pas dans le cas général
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SQL> SELECT deptno,
    Min(sal) KEEP (DENSE_RANK FIRST ORDER BY job) "Worst",
    Min(sal) KEEP (DENSE_RANK LAST ORDER BY job) "Best Min",
    Max(sal) KEEP (DENSE_RANK LAST ORDER BY job) "Best Max"
       FROM emp
       GROUP BY deptno  2    3    4    5    6  ;
     
        DEPTNO      Worst   Best Min   Best Max
    ---------- ---------- ---------- ----------
            10       1300       5000       5000
            20       3000       2975       2975
            30        950       1250       1600

Discussions similaires

  1. Pb requête imbriquée
    Par ddams dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/04/2004, 12h13
  2. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 22h52
  3. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  4. Requêtes imbriquées ?
    Par Ph. B. dans le forum XMLRAD
    Réponses: 7
    Dernier message: 06/05/2003, 13h19
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

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