Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 15/11/2011, 15h35   #1
Invité de passage
 
Inscription : février 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 3
Points : 1
Points : 1
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 :
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
Blinx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 15h44   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 644
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 644
Points : 2 641
Points : 2 641
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/
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 17h07   #3
Invité de passage
 
Inscription : février 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 3
Points : 1
Points : 1
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 :
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.
Blinx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 17h26   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 644
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 644
Points : 2 641
Points : 2 641
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 )
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 17h28   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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 ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 17h28   #6
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 426
Points : 6 426
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 10h12   #7
Invité de passage
 
Inscription : février 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 3
Points : 1
Points : 1
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.
Blinx 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 13h24.


 
 
 
 
Partenaires

Hébergement Web