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 23/01/2011, 11h49   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 8
Points : 1
Points : 1
Par défaut Requete SQL sur 2 tables

Bonjour,

je cherche une requête SQL afin d'afficher tous les champs de la table 1 et seulement les derniers champs de la table 2 que correspondent à l'ID de la table 1.

Table 1 :
ID label
1 AAA
2 BBB
3 CCC
4 DDD

Table 2 :
ID label date
4 DDD 10/01/2011
2 BBB 14/01/2011
4 DDD 15/01/2011

Résultat :
1 AAA
2 BBB 14/01/2011
3 CCC
4 DDD 15/01/2011

Je ne sais pas s'il faut une jointure, une table croisée, un distinct, un inner join ?

Merci de votre aide.
manudax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 12h14   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Il faut faire un groupement par ID + Label sur la table 2 pour chercher la dernière date puis faire une jointure externe sur cette sous requête à partir de la table 1 pour avoir tous les membres de la table 1.

Tu essaies et tu nous montres ce que tu as fait au lieu qu'on te donne la solution toute faite ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 13h02   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 8
Points : 1
Points : 1
Merci pour ces pistes,
j'ai donc essayé quelques requêtes après avoir parcouru les 2 liens groupement et jointure.

Ma table 2 est un peu différente de celle définie dans mon premier post, elle ne contient pas de label, désolé pour l'erreur.

Table 1 :
ID label
1 AAA
2 BBB
3 CCC
4 DDD

Table 2 :
ID date
4 10/01/2011
2 14/01/2011
4 15/01/2011

Résultat :
1 AAA
2 BBB 14/01/2011
3 CCC
4 DDD 15/01/2011


Code :
1
2
3
4
SELECT T1.ID, T1.label 
FROM T1 
LEFT JOIN T2 ON T1.ID = T2.ID
 GROUP BY T2.ID
Mais cette requête ne ramène pas tous les enregistrements de la table 1
manudax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 14h11   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Où est la recherche de la dernière date dans ta requête ?
Citation:
Mais cette requête ne ramène pas tous les enregistrements de la table 1
Normal ! Tu groupes par ID de la table 2 !

Allons-y par étapes...

1) Quelle est la dernière date pour chaque ID ?
Code :
1
2
3
SELECT ID, MAX(la_date) AS derniere_date
FROM table2
GROUP BY ID
Au passage, "date" est un mot réservé du langage SQL et il ne faut pas appeler ses colonnes ou ces tables avec cette liste de mots.

2) Faisons maintenant la jointure externe :
Code :
1
2
3
4
5
6
7
8
9
SELECT t1.ID, t1.label, tmp.derniere_date
FROM table1 t1
LEFT OUTER JOIN
(
  SELECT ID, MAX(la_date) AS derniere_date
  FROM table2
  GROUP BY ID
) tmp ON tmp.ID = t1.ID
ORDER BY t1.ID
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 15h36   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 8
Points : 1
Points : 1
Bien la réponse, merci pour cette explication.
j'étais très loin de la solution, j'avais bien essayé du côté de la requête imbriqué mais sans succès.

Il faut se poser les bonnes questions dans le bon ordre et je n'ai pas ce réflexe.

La première requête renvoi bien le résultat recherché ( sélection des dernières dates )

qu'il faut joindre à la seconde. Il me manque aussi pas mal de contenu, je ne savais pas que l'on pouvait utiliser tmp puis le reprendre dans une sous requête.

Cette requête est un exemple complet et me resservira pour d'autres cas.

Merci encore et bonne journée.
manudax 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 02h47.


 
 
 
 
Partenaires

Hébergement Web