kaelinou
Messages postés9Date d'inscriptionjeudi 4 septembre 2014StatutMembreDernière intervention14 septembre 2014
-
Modifié par Whismeril le 4/09/2014 à 07:17
kaelinou
Messages postés9Date d'inscriptionjeudi 4 septembre 2014StatutMembreDernière intervention14 septembre 2014
-
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?
kaelinou
Messages postés9Date d'inscriptionjeudi 4 septembre 2014StatutMembreDernière intervention14 septembre 2014 4 sept. 2014 à 13:21
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?
jordane45
Messages postés37858Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention 5 décembre 2023343 4 sept. 2014 à 17:13
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
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és18799Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 6 décembre 2023645 4 sept. 2014 à 23:24
J'ai encore ajouté les balises de code à ton message, merci d'y penser la prochaine fois.
kaelinou
Messages postés9Date d'inscriptionjeudi 4 septembre 2014StatutMembreDernière intervention14 septembre 2014 5 sept. 2014 à 00:06
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'"
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 & "'"
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 & "'"
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 & "'"
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.
jordane45
Messages postés37858Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention 5 décembre 2023343 5 sept. 2014 à 10:26
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.....
kaelinou
Messages postés9Date d'inscriptionjeudi 4 septembre 2014StatutMembreDernière intervention14 septembre 2014 5 sept. 2014 à 15:41
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)