Sélectionner les enregistrements pour la valeur max d'un champ d'une table liée

cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013 - 18 nov. 2011 à 14:12
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 - 23 nov. 2011 à 01:07
Bonjour,

Je souhaite faire une requête SQL à partir d'excel, dans une base Access.

J'ai deux tables liées par des champs d'index :
Table 1 -> Nro Documents
Table 2 -> Rév Documents

Je souhaire récupérer l'ensemble des champs des deux tables avec la totalité des enregistrements de la Table 1 (jointure left join). Ceci uniquement pour la révision maximale du document (Champ "Nro de révision" de la Table 2)
Les deux tables comportent un champ d'index numéro automatique. Ceci m'interdit les forme comme Select table1.*,Table2.* ...

Auriez-vous une solution ?

Petit détail la valeur de la révision est alphanumérique. Peut-on déterminer ma méthode ce comparaison ?

Merci d'avance de prendre du temps à réfléchir à mon problème.

RLAPT

6 réponses

cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
19 nov. 2011 à 11:34
Bonjour,

Peux tu donner une description de tes deux tables avec plus de détails.
(liste des champs)

Dans ta table2 toutes les révisions d'un même document sont elles enregistrées (*), ou simplement la dernière révision?

(*) dans ce cas, as tu une description du fonctionnement de ta révision car en alpha numérique on peut inventer ce que l'on veut ! par ex : 1,2 ou 1a,1b,2a et même 1a4j,1b5y ...

Bonne journée



Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
22 nov. 2011 à 10:50
Salut,

pour ce qui est de la requête il te suffit de passer par un GROUP BY, ex. :
SELECT doc.id, doc.titre, MAX(rev.numero)
  FROM doc, rev
 WHERE doc.id = re.iddoc
 GROUP BY doc.id;


Pour ce qui est de la comparaison des révisions alphanum, deux cas :
- les "numéros" de révision suivent l'ordre alphabétique -> rien à faire,
- les "numéros" de révision sont n'importe comment (ce qui n'aurait pas de sens dans le cadre d'une fonctionnalité d'historisation, mais bon) -> tu devras peut-être ajouter une colonne à ta table "rev" qui permettra un ordonnancement plus simple, genre un entier incrémenter, ou une date.

bon PL
0
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
22 nov. 2011 à 11:32
Bonjour,

C'est bien comme requete mais attention si les revisions sont de la forme 1a,1b,2a ...

la version 1a est plus grande que la version 10a il faut donc stocker 01a.
Bonne journée



Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
22 nov. 2011 à 19:45
Bonsoir,

Merci du temps passé pour trouver une solution aux difficultés que je rencontre.

Pour la proposition de Jopop, je n'arrive pas à faire fonctionner le code dans la mesure où comme j'écrivais dans mon premier texte le fait de vouloir récupérer tous les champs interdit l'emploi du group by

Pour ce qui concerne les révisions ; dans l'industrie il est commun d'utiliser des révisions que j'appellerai interne en numérique jusqu'à la commande de où l'on utilise le document, puis en numérique après la commande.

J'ai donc pour un même document une succession de révision du style A0, A1, A2 puis 01, 02, 03 ce qui ne facilite pas le classement.

Merci encore.

RLAPT
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
22 nov. 2011 à 22:16
Bonjour,

Comme l'a dit Jojop tu dois ajouter un champ DateRevision (smalldatetime ou entier incrémenté automatiquement) avec comme valeur par défaut getdate().

et ensuite pour récupérer toutes les lignes passer par une table temporaire dans un procedure stockée

Sa requete devient alors (a mettre dans une procedure stockée :

SELECT rev.iddoc, Dater=MAX(rev.DateRevision)
into #tmp
FROM rev
GROUP BY rev.iddoc;

select doc.*,rev.* 
from doc,rev,#tmp t
where doc.iddoc = t.iddoc
and rev.iddoc = t.iddoc
and rev.DateRevision = t.Dater

drop table #tmp


Attention dans le champ DateRevision les heures,minutes et secondes doivent être stockées ou alors tu risques d'avoir deux versions avec la même date.

Si tu choisis de mettre un champ entier incrementé, les enregistrements devront vraiment être entrés dans le bon ordre. Plus moyen de les modifier.

Bonne soirée



Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
23 nov. 2011 à 01:07
OOOPPPSSSS j'ai glissé
mille excuses c'est jopop



Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0