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

InterBase Discussion :

requete sql pour recuperer le dernier enregistrement inséré ?


Sujet :

InterBase

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 17
    Points
    17
    Par défaut requete sql pour recuperer le dernier enregistrement inséré ?
    bonjour

    dans une table qui contien un champ date;j'aimerai bien savoir s'il existe une requette sql pour recuperer l'enregistrement le plus recent(date) ou recuperer le dernier enregistrement inserer dans cette table ?

    merci

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    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 804
    Points : 34 077
    Points
    34 077
    Billets dans le blog
    14
    Par défaut
    Récupérer la ligne qui a la date la plus récente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM tatable
    WHERE colonnedate = MAX(colonnedate)
    Récupérer la dernière ligne enregistrée dans une table avec une clé primaire auto-incrémentée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM tatable
    WHERE colonnecleprimaire = MAX(colonnecleprimaire)
    Compris le principe ?

  3. #3
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Je pense qu'un supercalculateur ne pourrait compter le nombre de fois où une question strictement identique a été posée. Ce serait bien de chercher dans le forum avant de poster une question. D'ailleurs cela fait partie des bonnes pratiques d'utilisation du forum.

    Donc en recherchant "dernier enregistrement" sur le forum on obtient le résultat suivant.

    Cordialement

  4. #4
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Points : 3 076
    Points
    3 076
    Par défaut
    Est-ce que cette table reprend un champs numérique qui est incrémenté lors de chaque ajout ? Ce serait la meilleure manière de procéder.

    Maintenant si tu n'as qu'un champs date, je te conseille aussi d'y ajouter l'heure (et donc DateTime) afin que ton record soit plus aisément localisable.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 927
    Points : 51 735
    Points
    51 735
    Billets dans le blog
    6
    Par défaut
    Attention : un auto incrément cela peut fonctionner en décroissance et cela peut se débrancher. Autrement dit, cette requête est généralement fausse.

    A +

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    et comment faire pour recuperer l'avant dernier enregistrement inserer ?
    merci pour vos repenses

  7. #7
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    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 804
    Points : 34 077
    Points
    34 077
    Billets dans le blog
    14
    Par défaut
    Toujours en se basant sur le fait que tu as un champ DATE ou DATETIME qui contient la date et/ou l'heure de la création de la ligne, la requête ci-dessous te donne les deux plus récents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM tatble
    ORDER BY colonnedate DESC
    LIMIT 2
    Dès lors il est facile de trouver l'avant dernier inséré, qui se trouve être le dernier de la liste retournée par la requête précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM (
      SELECT * 
      FROM tatble
      ORDER BY colonnedate DESC
      LIMIT 2
    ) tmp
    ORDER BY colonnedate ASC
    LIMIT 1

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 121
    Points : 28 531
    Points
    28 531
    Par défaut
    Ne pas oublier que LIMIT n'est pas une clause du langage SQL normalisé.
    Cette requête n'est donc utlisable que sur un nombre restreint de SGBD

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Ne pas oublier que LIMIT n'est pas une clause du langage SQL normalisé.
    Cette requête n'est donc utlisable que sur un nombre restreint de SGBD
    Salut Al1 !

    taze1, peux-tu nous préciser ton SGBD ?

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    j'utilise rows a la place de limit (interbase)

  11. #11
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    611
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 611
    Points : 2 086
    Points
    2 086
    Par défaut
    Bonjour,

    Quand on va chercher "le dernier enregistrement créé", il faut faire attention au type de transaction en cours, pour être certain de bien aller chercher le dernier créé par moi

    Je suppose que c'est pour récupérer la clé primaire afin de la fournir comme clé étrangère à un enregistrement détails dans une autre table.

    Effectuer une recherche à la suite de chaque création ne me paraît pas le plus optimisé.

    Donc personnellement, je fais une requête pour obtenir un nouveau générateur,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT GEN_ID( "MON_GENERATEUR" , 1 ) FROM RDB$DATABASE
    et j'affecte moi même la valeur obtenu comme clé primaire à mon enregistrement maitre.
    Ainsi je n'ai pas besoin de rechercher l'enregistrement que je viens de créer.

    Si le trigger before insert est bien écrit, l'auto-incrémentation se fera très bien si mon INSERT ne fourni pas de clé primaire ou utilisera ma clé primaire si j'en fourni une.

    Les seuls 2 défauts que je vois à cette méthode :
    • incompatibilité avec d'autres SGBD (mais cela se contourne avec un peu d'encapsulation. Mon programme fonctionne tant sous Firebird que MySQL alors que la récupération de la clé primaire se fait très différemment sous ces deux systèmes)
    • je peux perdre des générateurs plus facilement qu'avec les triggers (mais est-ce un vrai problème ?).


    Cordialement
    Gabriel

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Bonjour;
    Permettez-moi de participer dans cette discussion qui m'intéresse beaucoup

    Vanquish, pouvez-vous encore expliquer votre méthode

    Le trigger de ma table se présente ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER TRIG_IDCOMMANDE_GENID FOR COMMANDE
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
      IF ( NEW.id_commande IS NULL ) THEN
        NEW.id_commande = GEN_ID(gen_commande_id,1);
    END
    Si j'affecte moi même la valeur de ID_COMMANDE à l'insertion, et en cas de roolback est-ce correct de faire
    SELECT GEN_ID( "MON_GENERATEUR" , -1 ) FROM RDB$DATABASE
    afin de ne pas perdre de position de l'auto-incrément de ma clé primaire ?




    Désolé mais je suis vraiment débutant

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 341
    Points : 41 876
    Points
    41 876
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par mameziane Voir le message
    est-ce correct de faire
    SELECT GEN_ID( "MON_GENERATEUR" , -1 ) FROM RDB$DATABASE
    afin de ne pas perdre de position de l'auto-incrément de ma clé primaire ?
    Non , à mon avis ta proposition va modifier la valeur par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT GEN_ID( "MON_GENERATEUR" , 0 ) -1  FROM RDB$DATABASE
    ne modifie en rien la valeur du générateur

  14. #14
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    ça Bien Marcher avec moi de recuper la derniere date ou bien le dernier enregestremnt
    base de donne (absolute database);

    pour la dernièredate:
    //******pour récupérer la dernier date enregistre *****//
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT MAX(COLONNEDATE) as "DERNIER-DATE" from VOTRETABLE
    //********pour récupérer tous les enregistrement de la dernier date enregistre***********//
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from VOTRETABLE where COLONNEDATE = (SELECT MAX(COLONNEDATE) as "DERNIER-DATE" from VOTRETABLE)
    //*******************//
    pour récupérer le dernier enregistrement :
    //*******************//
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(ID_CLEPRIMAIRE) as "DERNIER_ID" from VOTRETABE
    //******POUR RECUPERE TOUTE LA LIGNE DE DERNIER ENREGESTREMENT ****//
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from VOTRETABLE where ID_CLEPRIMAIRE = (SELECT MAX(ID_CLEPRIMAIRE) as "DERNIER_ID" from VOTRETABLE)

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/12/2010, 18h02
  2. recuperer le dernier enregistrement dans un table sql
    Par moukit233 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/07/2009, 13h16
  3. Requete sql pour création de table dans une base access
    Par Ben156 dans le forum Bases de données
    Réponses: 1
    Dernier message: 17/01/2006, 23h12
  4. Réponses: 5
    Dernier message: 29/12/2005, 08h03
  5. Réponses: 5
    Dernier message: 01/02/2005, 18h29

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