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

Langage SQL Discussion :

Explications sur une requête


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Explications sur une requête
    Bonjour a tous.

    Je suis tombé sur une requête en SQL dont je n'arrive pas à comprendre le fonctionnement.
    Etant un novice dans ce domaine, je sollicite votre aide pour m'aider à comprendre son fonctionnement.

    Petit prérequis, la table hbat contient les colonnes suivantes :
    id : l'id du batiment (non unique)
    num_version : le numéro de version des infos sur le bâtiment (un bâtiment peut avoir plusieur fois la même version)
    libelle : le nom du bâtiment
    ts_statut : date de la dernière modification des informations du bâtiment

    En gros cette requête permet de générer la date de fin d'une version, (en prenant la date de début de la version suivante).

    ex pour les tuples suivants :
    id=3  num_version=2 ts_statut=10/02/2001
    id=3  num_version=2 ts_statut=13/02/2001
    id=3  num_version=2 ts_statut=18/02/2001
    id=3  num_version=3 ts_statut=22/02/2001
    on obtient :
    pour le batiment 3, version 2, debut :10/02/2001, fin : 22/02/2001
    pour le batiment 3, version 3, debut :22/02/2001, fin : ---

    et voilà la requête :

    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
            bat.id id,
            bat.num_version num_version,
            bat.libelle libelle,
            min(bat.ts_statut) dateDebut,
            min(bat2.ts_statut) dateFin     
        from
            hbat bat,
            hbat bat2     
        where
                  bat.id = bat2.id(+)     
            and bat.num_version = bat2.num_version(+) - 1    
        group by
            bat.id,
            bat.num_version,
            bat.libelle

    Merci d'avance pour vos réponses

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    toutes les réponses sont ici :
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/



    ceci étant dit vous devriez commencer par ca :
    http://sqlpro.developpez.com/cours/sqlaz/select/

    et ca :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour ces liens, cependant ce n'est pas un élément du SQL qui me pose problème, mais la logique qu'il y a derrière la requête.

    Dans l'absolue, je sais à quoi sert un group by, un where ou une jointure externe, mais dans mon cas je ne comprends pas comment la requête va me donner le résultat que j’attends.

    Mon interrogation se situe notamment au niveau de la seconde clause where :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bat.num_version = bat2.num_version(+) - 1
    Pour moi, la logique voudrait que pour récupérer la version suivante, on fasse +1 et non pas -1 comme c'est le cas ici.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Ah forcément quand vosu expliquez ce que vosu ne comprennez pas .. on pourra mieux vous répondre.


    Je vois la chose comme ça :
    La date de fin d'une version correspond à la date minimum de la version supérieur.

    Le (+) ici sert à faire une jointure externe (oracle non ?).

    Du coup pour la version 2 il va prendre la date min de la v2 pour la date de début et la date min de la v3 pour la de fin de la v2 (et donc qui sera la date de début de la v3 )

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Remplacez (mentalement) les colonnes par leur valeur.
    id=3  num_version=2 ts_statut=10/02/2001
    id=3  num_version=3 ts_statut=22/02/2001
    Le début est en version 2, la fin en version 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bat.num_version = bat2.num_version(+) - 1
    -- >   2   =  3 - 1
    Rien d'anormal donc.

    On dirait du Oracle, si oui en connaissez-vous la version ?

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Au passage, on comprend mieux les choses avec des jointures normalisées (clause LEFT JOIN ou RIGHT JOIN pour les jointures externes)...
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci à tous pour vos réponses.

    Effectivement en posant la jointure sur papier avec l'exemple de Waldar, j'ai mieux compris comment ça fonctionnait.

    Je pense que c'est la jointure externe qui me perturbait.

    Merci à tous pour vos réponses, je vais pouvoir avancer.

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

Discussions similaires

  1. Besoin d'explication sur une requête.
    Par xtiand4 dans le forum SAP
    Réponses: 3
    Dernier message: 09/07/2008, 10h48
  2. [Requête] Explication sur une condition dans une Requête
    Par jimmymatrix dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/05/2007, 14h34
  3. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 11h12
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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