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

DB2 Discussion :

[DB2] Récupérer les 10 enregistrements les plus récents de 2 tables


Sujet :

DB2

  1. #1
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut [DB2] Récupérer les 10 enregistrements les plus récents de 2 tables
    Bonjour à tous,

    J'ai essayé comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (
        select tel_fab.CREA_DATE, tel_fab.STATUT, tra.MANUFACT_NUMBER, tra.SERIAL_NUMBER 
        from XMLSAMPLES.TRACE_CONF tra join XMLSAMPLES.EVT_TELECHARG_FAB tel_fab on tra.ID_TRACE_CONF = tel_fab.ID_TRACE_CONF
    ) 
    union 
    (
        select tel_sav.CREA_DATE, tel_sav.STATUT, tra.MANUFACT_NUMBER, tra.SERIAL_NUMBER 
        from XMLSAMPLES.TRACE_CONF tra join XMLSAMPLES.EVT_TELECHARG_SAV tel_sav on tra.ID_TRACE_CONF = tel_sav.ID_TRACE_CONF
    )
    order by CREA_DATE DESC
    FETCH FIRST 10 ROWS ONLY
    Problème : Ca ne me retourne que les "STATUT", "MANUFACT_NUMBER", "SERIAL_NUMBER" de la 1ère requête !


    Comment recevoir réellement les valeurs des 3 champs cités ci-dessus correspondantes aux 10 dernières valeurs du champ CREA_DATE commun aux 2 tables EVT_TELECHARG_FAB et EVT_TELECHARG_SAV et non pas uniquement celles de la table EVT_TELECHARG_FAB ?


    Gôm

  2. #2
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    J'ai fait ce test et je n'ai eu aucun problème avec DB2 8.1 via un query java en utilisant un drivers JDBC type 2 ou type 4.

    La seule différence est que j'utilise un "order by 2" (numero de col au lieu de son nom) et pas de jointure dans mon test.

    PS : Essaye de faire déplacer ton message dans le forum db2

  3. #3
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Merci pour ta réponse, mais je pense que je me suis mal exprimé en expliquant mon problème.

    En fait, je souhaite récupérer des informations présentes dans 2 tables différentes pour les mettre dans une même colonne.

    Table EVT_TELECHARG_FAB :
    ID_EVT_TELECHARG_FAB -- MANUFACT_NUMBER -- STATUT -- CREA_DATE -- UPDATE_DATE -- ID_TRACE_CONF

    Table EVT_TELECHARG_SAV :
    ID_EVT_TELECHARG_SAV -- SERIAL_NUMBER -- STATUT -- CREA_DATE -- UPDATE_DATE -- ID_TRACE_CONF

    Je souhaite donc récupérer dans une seule et même colonne la valeur des 10 enregistrements les plus récents qu'ils soient dans la table EVT_TELECHARG_FAB ou dans la table EVT_TELECHARG_SAV.

  4. #4
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    Je pense avoir parfaitement compris... (sauf que c est pas dasn une seule colonne mais dans une seule requete - avec chaque colonne pouvant contenir des données en provenant de tel_fab ou tel_sav)

    Le problème semble être au niveau du "FETCH FIRST 10 ROWS ONLY" qui effectue cette limitation avant d'avoir effectuer l'order by sur l'union des deux requètes.

    Essaye de faire visualiser ton plan d'execution et ajoute une colonne static pour etre certain de l'origine de tes données.

    Essaye egalement sans le "FETCH FIRST 10 ROWS ONLY" histoire d evérifier si dans ce cas les 10 premiers sont bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    (
        SELECT '1', tel_fab.CREA_DATE, tel_fab.STATUT, tra.MANUFACT_NUMBER, tra.SERIAL_NUMBER 
        FROM XMLSAMPLES.TRACE_CONF tra JOIN XMLSAMPLES.EVT_TELECHARG_FAB tel_fab ON tra.ID_TRACE_CONF = tel_fab.ID_TRACE_CONF
    ) 
    union 
    (
        SELECT '2', tel_sav.CREA_DATE, tel_sav.STATUT, tra.MANUFACT_NUMBER, tra.SERIAL_NUMBER 
        FROM XMLSAMPLES.TRACE_CONF tra JOIN XMLSAMPLES.EVT_TELECHARG_SAV tel_sav ON tra.ID_TRACE_CONF = tel_sav.ID_TRACE_CONF
    )
    ORDER BY CREA_DATE DESC
    FETCH FIRST 10 ROWS ONLY

  5. #5
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    En fait, si je joue la requête suivante et ça me donne toujours des résultats incorrectes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (
        SELECT '1', tel_fab.CREA_DATE, '1' + tel_fab.STATUT, tel_fab.MANUFACT_NUMBER/*, tra.MANUFACT_NUMBER, tra.SERIAL_NUMBER */
        FROM XMLSAMPLES.TRACE_CONF tra JOIN XMLSAMPLES.EVT_TELECHARG_FAB tel_fab ON tra.ID_TRACE_CONF = tel_fab.ID_TRACE_CONF
    ) 
    union 
    (
        SELECT '2', tel_sav.CREA_DATE, '2' + tel_sav.STATUT, tel_sav.SERIAL_NUMBER/*, tra.MANUFACT_NUMBER, tra.SERIAL_NUMBER */
        FROM XMLSAMPLES.TRACE_CONF tra JOIN XMLSAMPLES.EVT_TELECHARG_SAV tel_sav ON tra.ID_TRACE_CONF = tel_sav.ID_TRACE_CONF
    )
    ORDER BY CREA_DATE DESC
    FETCH FIRST 10 ROWS ONLY

    Résultats :

    2 2008-09-03 17:26:12.468 9 999123
    1 2008-03-05 23:59:59.000 8 250923
    1 2008-03-03 23:59:59.000 8 253629
    1 2008-02-11 23:59:59.000 8 249676
    1 2008-02-06 23:59:59.000 8 350087
    1 2008-01-30 23:59:59.000 8 246360
    1 2008-01-14 23:59:59.000 8 354667
    1 2008-01-14 23:59:59.000 8 354703
    1 2008-01-14 23:59:59.000 8 361113
    1 2008-01-14 23:59:59.000 8 361232

  6. #6
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    Là, je ne comprend plus (ou pas) où est le problème. La requète retourne bien des données issues des deux selects (1er ligne select "2") .

    Le problème est au niveau des jointures ?

  7. #7
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Oui c'est ça !

    La valeur de la dernière colonne de la première ligne correspond à l'addition du 1er MANUFACT_NUMBER de tel_fab avec le 1er SERIAL_NUMBER de tel_sav !

  8. #8
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    Vraiment très étrange cela...

    Tu peux essayer
    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 '1', A.CREA_DATE, A.STATUT, A.MANUFACT_NUMBER
        FROM XMLSAMPLES.EVT_TELECHARG_FAB A,
                XMLSAMPLES.TRACE_CONF B
         Where A.ID_TRACE_CONF = B.ID_TRACE_CONF
    ) 
    union 
    (
        SELECT '2', C.CREA_DATE, C.STATUT, C.SERIAL_NUMBER
        FROM  XMLSAMPLES.EVT_TELECHARG_SAV C,
                 XMLSAMPLES.TRACE_CONF D
        WHERE C.ID_TRACE_CONF = D.ID_TRACE_CONF
    )
    ORDER BY 2 DESC
    FETCH FIRST 10 ROWS ONLY
    Mais je ne vois aucune raison a ton problème

    Que donne les requetes 1 et 2 exécutée séparément ?


    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
     
        SELECT '1', A.CREA_DATE, A.STATUT, A.MANUFACT_NUMBER
        FROM XMLSAMPLES.EVT_TELECHARG_FAB A,
                XMLSAMPLES.TRACE_CONF B
         Where A.ID_TRACE_CONF = B.ID_TRACE_CONF
        ORDER BY 2 DESC
        FETCH FIRST 10 ROWS ONLY   
     
     
        SELECT '2', C.CREA_DATE, C.STATUT, C.SERIAL_NUMBER
        FROM  XMLSAMPLES.EVT_TELECHARG_SAV C,
                 XMLSAMPLES.TRACE_CONF D
        WHERE C.ID_TRACE_CONF = D.ID_TRACE_CONF
        ORDER BY 2 DESC
        FETCH FIRST 10 ROWS ONLY

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 123
    Points : 146
    Points
    146
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La valeur de la dernière colonne de la première ligne correspond à l'addition du 1er MANUFACT_NUMBER de tel_fab avec le 1er SERIAL_NUMBER de tel_sav !
    C'est pas possible en relationnel.

  10. #10
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Je ne connais pas la logique de tes 3 tables. Ceci dit, si par rapport à la 1ère table TRACE, une ligne est présente soit dans la table FAB, soit dans la table SAV et jamais dans les 2, tu peux transformer ton union en jointure externe ce qui résoudra ton problème et t'évitera en plus de lire 2 fois la 1ère table, ce qui est tout bénéf en terme de perf. Tu évites également le tri de l'union, autre gain en perf. Cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT	COALESCE(tel_fab.CREA_DATE, tel_sav.CREA_DATE),
    COALESCE(tel_fab.STATUT, tel_sav.STATUT),
    tra.MANUFACT_NUMBER,
    tra.SERIAL_NUMBER 
    FROM		XMLSAMPLES.TRACE_CONF tra
    LEFT JOIN 	XMLSAMPLES.EVT_TELECHARG_FAB tel_fab
    ON		tra.ID_TRACE_CONF = tel_fab.ID_TRACE_CONF
    LEFT JOIN 	XMLSAMPLES.EVT_TELECHARG_SAV tel_sav
    ON		tra.ID_TRACE_CONF = tel_sav.ID_TRACE_CONF
    ORDER BY 	1 DESC
    FETCH FIRST 10 ROWS ONLY

Discussions similaires

  1. [MySQL] Récupérer les 20 enregistrements les plus récents
    Par Alexdezark dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 30/08/2009, 00h56
  2. Réponses: 5
    Dernier message: 02/05/2008, 16h28
  3. Ne conserver que les N enregistrement les plus récents.
    Par gomodo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/01/2008, 20h46
  4. Réponses: 3
    Dernier message: 28/11/2003, 22h26

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