OVH Cloud OVH Cloud

Jointure de tables

2 réponses
Avatar
Pierre BOUSQUET
Bonjour, J'ai 2 tables :
1. commandes
- n° de cde

2. traçabilité
- n° de cde
- DateHeure
- libellé


J'aimerai (en une seule requête, si possible) obtenir pour chaque
commande la dernière ligne de traçabilité saisie.

exemple :
commande n° 002562
traçabilité : 002562 20/11/2006 08:00 B
002562 20/11/2006 15:30 A


Résultat que j'aimerai obtenir :
002562 20/11/2006 15:30 A

Impossible d'utiliser une jointure à cause des agrégations :
SELECT commandes.num_cde, MAX(dateheure) as date, MAX(libelle) as
libelle FROM commandes LEFT JOIN tracabilite GROUP BY commandes.num_cde

me renverrai
002562 20/11/2006 15:30 B



Solution de sous requete (mais impossible)
SELECT commandes.num_commande, (SELECT TOP 1 dateheure, libelle FROM
tracabilite WHERE tracabilite.num_commande=commandes.num_commande ORDER
BY dateheure DESC) FROM commandes

Seule solution que j'ai trouvée :
SELECT commandes.num_commande, (SELECT TOP 1 dateheure FROM tracabilite
WHERE tracabilite.num_commande=commandes.num_commande ORDER BY
dateheure DESC) as dateheure,(SELECT TOP 1 libelle FROM tracabilite
WHERE tracabilite.num_commande=commandes.num_commande ORDER BY
dateheure DESC) as libelle FROM commandes

Le problème de cette solution c'est que la requete de recherche dans
'tracabilite' va être exécuté X fois en fonction du nombre de champs
que je veux afficher.

Auriez-vous une autre solution

Merci d'avance

PS : désolé pour ce long discours

--
Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "

2 réponses

Avatar
Test recherche
Bonjour
Je pense que cei devrait fonctionner


Select tracabilite.num_commande, tracabilite.dateheure, tracabilite.libellé
From tracabilite
Inner Join commande
On commande.num_commande = tracabilite.num_commande
Inner Join
(
Select num_commande As "numsousreq",
Max(dateheure) As "dateesousreq"
From tracabilite
Group By num
) As l_sousreq
On l_sousreq.numsousreq = trac.num And l_sousreq.dateesousreq = datee

du moins j'espère
Cordialement
Stéphane





"Pierre BOUSQUET" a écrit dans le message de news:

Bonjour, J'ai 2 tables :
1. commandes
- n° de cde

2. traçabilité
- n° de cde
- DateHeure
- libellé


J'aimerai (en une seule requête, si possible) obtenir pour chaque commande
la dernière ligne de traçabilité saisie.

exemple :
commande n° 002562
traçabilité : 002562 20/11/2006 08:00 B
002562 20/11/2006 15:30 A


Résultat que j'aimerai obtenir :
002562 20/11/2006 15:30 A

Impossible d'utiliser une jointure à cause des agrégations :
SELECT commandes.num_cde, MAX(dateheure) as date, MAX(libelle) as libelle
FROM commandes LEFT JOIN tracabilite GROUP BY commandes.num_cde

me renverrai
002562 20/11/2006 15:30 B



Solution de sous requete (mais impossible)
SELECT commandes.num_commande, (SELECT TOP 1 dateheure, libelle FROM
tracabilite WHERE tracabilite.num_commande=commandes.num_commande ORDER BY
dateheure DESC) FROM commandes

Seule solution que j'ai trouvée :
SELECT commandes.num_commande, (SELECT TOP 1 dateheure FROM tracabilite
WHERE tracabilite.num_commande=commandes.num_commande ORDER BY dateheure
DESC) as dateheure,(SELECT TOP 1 libelle FROM tracabilite WHERE
tracabilite.num_commande=commandes.num_commande ORDER BY dateheure DESC)
as libelle FROM commandes

Le problème de cette solution c'est que la requete de recherche dans
'tracabilite' va être exécuté X fois en fonction du nombre de champs que
je veux afficher.

Auriez-vous une autre solution

Merci d'avance

PS : désolé pour ce long discours

--
Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "




Avatar
Pierre BOUSQUET
très bien , merci

Test recherche avait prétendu :
Bonjour
Je pense que cei devrait fonctionner


Select tracabilite.num_commande, tracabilite.dateheure, tracabilite.libellé
From tracabilite
Inner Join commande
On commande.num_commande = tracabilite.num_commande
Inner Join
(
Select num_commande As "numsousreq",
Max(dateheure) As "dateesousreq"
From tracabilite
Group By num
) As l_sousreq
On l_sousreq.numsousreq = trac.num And l_sousreq.dateesousreq = datee

du moins j'espère
Cordialement
Stéphane





"Pierre BOUSQUET" a écrit dans le message de news:

Bonjour, J'ai 2 tables :
1. commandes
- n° de cde

2. traçabilité
- n° de cde
- DateHeure
- libellé


J'aimerai (en une seule requête, si possible) obtenir pour chaque commande
la dernière ligne de traçabilité saisie.

exemple :
commande n° 002562
traçabilité : 002562 20/11/2006 08:00 B
002562 20/11/2006 15:30 A


Résultat que j'aimerai obtenir :
002562 20/11/2006 15:30 A

Impossible d'utiliser une jointure à cause des agrégations :
SELECT commandes.num_cde, MAX(dateheure) as date, MAX(libelle) as libelle
FROM commandes LEFT JOIN tracabilite GROUP BY commandes.num_cde

me renverrai
002562 20/11/2006 15:30 B



Solution de sous requete (mais impossible)
SELECT commandes.num_commande, (SELECT TOP 1 dateheure, libelle FROM
tracabilite WHERE tracabilite.num_commande=commandes.num_commande ORDER BY
dateheure DESC) FROM commandes

Seule solution que j'ai trouvée :
SELECT commandes.num_commande, (SELECT TOP 1 dateheure FROM tracabilite
WHERE tracabilite.num_commande=commandes.num_commande ORDER BY dateheure
DESC) as dateheure,(SELECT TOP 1 libelle FROM tracabilite WHERE
tracabilite.num_commande=commandes.num_commande ORDER BY dateheure DESC) as
libelle FROM commandes

Le problème de cette solution c'est que la requete de recherche dans
'tracabilite' va être exécuté X fois en fonction du nombre de champs que je
veux afficher.

Auriez-vous une autre solution

Merci d'avance

PS : désolé pour ce long discours

-- Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "







--
Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "