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

kaelinou 9 Messages postés jeudi 4 septembre 2014Date d'inscription 14 septembre 2014 Dernière intervention - 4 sept. 2014 à 04:23 - Dernière réponse : kaelinou 9 Messages postés jeudi 4 septembre 2014Date d'inscription 14 septembre 2014 Dernière intervention
- 5 sept. 2014 à 15:41
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 

Votre réponse

11 réponses

Whismeril 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention - 4 sept. 2014 à 07:17
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
jordane45 22567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - 4 sept. 2014 à 08:11
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
kaelinou 9 Messages postés jeudi 4 septembre 2014Date d'inscription 14 septembre 2014 Dernière intervention - 4 sept. 2014 à 13:21
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
jordane45 22567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - 4 sept. 2014 à 17:13
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
kaelinou 9 Messages postés jeudi 4 septembre 2014Date d'inscription 14 septembre 2014 Dernière intervention - 4 sept. 2014 à 17:46
0
Merci
Merci beaucoup, je teste et je reviens vers vous!
Commenter la réponse de kaelinou
kaelinou 9 Messages postés jeudi 4 septembre 2014Date d'inscription 14 septembre 2014 Dernière intervention - Modifié par Whismeril le 4/09/2014 à 23:23
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 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention - 4 sept. 2014 à 23:24
J'ai encore ajouté les balises de code à ton message, merci d'y penser la prochaine fois.
kaelinou 9 Messages postés jeudi 4 septembre 2014Date d'inscription 14 septembre 2014 Dernière intervention - 5 sept. 2014 à 00:06
Désolé!
Commenter la réponse de kaelinou
kaelinou 9 Messages postés jeudi 4 septembre 2014Date d'inscription 14 septembre 2014 Dernière intervention - Modifié par kaelinou le 5/09/2014 à 04:21
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
jordane45 22567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - 5 sept. 2014 à 10:26
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
kaelinou 9 Messages postés jeudi 4 septembre 2014Date d'inscription 14 septembre 2014 Dernière intervention - 5 sept. 2014 à 15:41
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.