Requetes Jointure multi-tables avec dates les plus recentes [Résolu]

Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014
-
Bonjour,
J'ai 3 tables :

Table1 --> Nom
Table2 --> Grade/DateNomination
Table3 --> DateVM

Je une requete qui fonctionne de facon à avoir :

Nom l Grade l DateNomination l DateVM

Qui est celle ci :

SELECT S.NOM , N.GRADE, N.DATE_NOMINATION,V.DATE_VM  
from (([SPV] S LEFT JOIN [NOMINATION] N ON S.nom=N.NOM) 
left join [VM] V ON S.nom=V.nom) order by S.NOM

Le problème que je n'arrive pas à resoudre c'est que je ne veux que les DateNomination DateVM les plus récentes alors que je vois actuellement toutes les dates. Comment puis-je faire cela?

Merci à vous de me donner un coup de pouce.
Afficher la suite 

9 réponses

Messages postés
13838
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 octobre 2019
311
0
Merci
Bonjour, message modifié par l'ajout des balises de code.
Voir ici comment bien utiliser la coloration syntaxique.
Commenter la réponse de Whismeril
Messages postés
26537
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 octobre 2019
316
0
Merci
Bonjour.

Les dates les plus récentes. .. ou LA date la plus récente (pour chacun de tes deux champs) ?

As tu regardé du côté de MAX ()
Commenter la réponse de jordane45
Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014
0
Merci
Bonjour,

merci de votre réponse rapide.

Oui c'est la date la plus récente de chaque champs je veux.
J'ai regardé du coté de max() mais la structure que j'ai testé ne plait pas trop avec la jointure.
Je pense que c'est ma manière de construire la requête qui gène, c'est possible de me donner un exemple?
Commenter la réponse de kaelinou
Messages postés
26537
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 octobre 2019
316
0
Merci
Bonjour,

Un exemple ?

Oui...
Pour mes besoins récents j'ai justement du en faire une... la voici :

SELECT *
FROM t_news N 
LEFT JOIN (
   SELECT * FROM t_news_items i
   JOIN(
	    SELECT i2.news_id as newsId
                 ,max(i2.id_news_item) as MaxIdItem
	    FROM t_news_items i2
	    GROUP BY news_id
	 ) as T3 ON (i.id_news_item = t3.MaxIdItem AND i.news_id = t3.newsId)
   ) AS T2 ON (N.id_news = T2.newsId)
LEFT JOIN c_users U ON U.id = N.news_id_createur
WHERE id_news='$id'


A adapter à TA requête bien entendu...


Si tu rencontres des soucis pour la mettre en place... reviens nous voir avec la requête tentée... et nous essaierons de te la corriger.

Commenter la réponse de jordane45
Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014
0
Merci
Merci beaucoup, je teste et je reviens vers vous!
Commenter la réponse de kaelinou
Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014
0
Merci
Je n'ai pas encore reussi à adapter la requete avec ton exemple precedent mais la précédente qui ne fonctionnait pas est celle ci :

SELECT S.NOM , N.GRADE, MAX(N.DATE_NOMINATION),MAX(V.DATE_VM) 
FROM (([SPV] S INNER JOIN [NOMINATION] N ON S.NOM = N.NOM) 
INNER JOIN [VM] V ON S.NOM = V.NOM) 
ORDER BY S.NOM


Je persévère!
Whismeril
Messages postés
13838
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 octobre 2019
311 -
J'ai encore ajouté les balises de code à ton message, merci d'y penser la prochaine fois.
kaelinou
Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014
-
Désolé!
Commenter la réponse de kaelinou
Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014
0
Merci
J'ai poussé mon probleme un peu plus loin, donc probleme supplémentaire!

J'ai maintenant 4 tables :

- Table1 --> Nom
- Table2 --> Nom l Grade l Date_Nomination
- Table3 --> Nom l Date_VM
- Table4 --> Nom l Formation l Date l Resultat

Je souhaite avoir un tableau final qui synthetise toutes les données :

- Colonne1 : Noms de la table1
- Colonne2 : Grade de la table 2
- Colonne3 : Date_Nomination de la table 2
- Colonne4 : Date_VM de la table 3
- Colonnes suivantes : Formations de la table4

Les cellules sont remplies par la date correspondant à ligne(i)/Colonne(j)

voici mon code (avec les balises cette fois ci...)


'----------------Remplissage des entetes de colonnes-----------------
DataGridView1.Columns.Add("NOM", "NOM")
DataGridView1.Columns(0).Frozen = True
DataGridView1.Columns.Add("GRADE", "GRADE")
DataGridView1.Columns.Add("DATE", "DATE")
DataGridView1.Columns.Add("VM", "VM")

mySelectquery = "SELECT distinct FORMATION from [HISTO] where recu='O'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
DataGridView1.Columns.Add(dtaRead.GetValue(0).ToString, dtaRead.GetValue(0).ToString)
End While

dtaRead.Close()
MyConnection.Close()

'-----------------------Remplissage des lignes-----------------------
mySelectquery = "SELECT distinct NOM from [SPV] WHERE ACTIF='O'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
DataGridView1.ROWS.Add(dtaRead.GetValue(0).ToString)
End While

dtaRead.Close()
MyConnection.Close()

'---------------------Remplissage des cellules---------------------

'-----Grade + Date_Nomination-----
For i As Integer=1 To DataGridView1.Rows.Count-2
Dim t As date="01/01/1900"
mySelectquery = "SELECT distinct N.Grade,N.Date_NOMINATION from [NOMINATION] N WHERE N.NOM='" & datagridview1.Rows(i).Cells(0).value & "'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
If CDate(dtaRead.GetValue(1).ToString)>CDate(t.ToString) Then
t=CDate(dtaRead.GetValue(1).ToString)
DataGridView1.ROWS(i).Cells(1).value=dtaRead.GetValue(0).ToString
DataGridView1.ROWS(i).Cells(2).value=Format(month(dtaRead.GetValue(1).ToString),"00") & "/"& microsoft.VisualBasic.Right(year(dtaRead.GetValue(1).ToString),2)
End if
End While

dtaRead.Close()
MyConnection.Close()
Next


'-----VM-----
For i As Integer=1 To DataGridView1.Rows.Count-2
Dim t As date="01/01/1900"
mySelectquery = "SELECT distinct Date_VM from [VM] WHERE NOM='" & datagridview1.Rows(i).Cells(0).value & "'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
If CDate(dtaRead.GetValue(0).ToString)>CDate(t.ToString) Then
t=CDate(dtaRead.GetValue(0).ToString)
DataGridView1.ROWS(i).Cells(3).value=Format(month (dtaRead.GetValue(0).ToString),"00") & "/"& microsoft.VisualBasic.Right(year(dtaRead.GetValue(0).ToString),2)
End if
End While

dtaRead.Close()
MyConnection.Close()
Next

'-----Formation-----
For i As Integer=1 To DataGridView1.Rows.Count-2
Dim t As date="01/01/1900"
For j As Integer=4 To DataGridView1.ColumnCount-1

mySelectquery = "SELECT distinct FIN from [HISTO] WHERE RECU='O' and NOM='" & datagridview1.Rows(i).Cells(0).value & "' and FORMATION='" & datagridview1.columns(j).HeaderText & "'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
If CDate(dtaRead.GetValue(0).ToString)>CDate(t.ToString) Then
t=CDate(dtaRead.GetValue(0).ToString
DataGridView1.ROWS(i).Cells(j).value=microsoft.VisualBasic.Right(year(dtaRead.GetValue(0).ToString),2)
End if
End While

dtaRead.Close()
MyConnection.Close()
Next
Next

Malheuresement la requete est longue à s'executer et je ne vois pas comment l'optimiser.

Si quelqu'un pouvait me donner une piste de travail.
Merci à vous.
Commenter la réponse de kaelinou
Messages postés
26537
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 octobre 2019
316
0
Merci
Bonjour,

Malheuresement la requete est longue à s'executer et je ne vois pas comment l'optimiser.

Si quelqu'un pouvait me donner une piste de travail.

Déjà... sans avoir la structure exacte de tes tables. ( Nom des champs.. Type (varchar..int...) ... est-ce qu'il y a des INDEX sur tes champs ... difficile de te répondre...

Dans les pistes de travail.. on peut déjà te dire :
1 - préférer des champs "numériques" pour faire les jointures au lieu de champs texte (les noms !!)
2 - Mettre des index sur champs
3 - Eviter les select * .. mais plutot faire un SELECT que des champs utils....



PS:
J'ai poussé mon probleme un peu plus loin, donc probleme supplémentaire!
=> Normalement... toute nouvelle question = ouverture d'une nouvelle discussion sur le forum !!


PS2 : Tu nous parles de soucis de requêtes... et tu nous donnes tout ton code .net... quel en est l'intérêt ? Tu devrais.. lorsque le souci ne concerne QUE le fonctionnement d'une requête... nous donner QUE la requête.....

Commenter la réponse de jordane45
Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014
0
Merci
Merci pour les quelques pistes.

PS2 : Tu nous parles de soucis de requêtes... et tu nous donnes tout ton code .net... quel en est l'intérêt ? Tu devrais.. lorsque le souci ne concerne QUE le fonctionnement d'une requête... nous donner QUE la requête.....

En fait tu as tout à fait raison, j'ai mis une grosse partie de mon code pour faire comprendre que je préfèrerais faire 1 seule requête à la place des 4 requêtes successives (et la mise en forme) mais je n'y arrive pas, d'où ma question de départ : Comment faire une requête unique de toutes mes requêtes? Mais la question de départ reste la même (Requêtes Jointure multi-tables avec dates les plus récentes)
Commenter la réponse de kaelinou