PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → REQUETE SQL IMBRIQUEE SUR 2 TABLEs
REQUETE SQL IMBRIQUEE SUR 2 TABLEs
Iniciado por j.bossut, 14,mar. 2019 10:21 - 4 respuestas
Publicado el 14,marzo 2019 - 10:21
Bonjour,
J'ai 2 tables ARTICLE ET LIGNECOMMANDEFR

Je souhaiterais faire une requete sur ces 2 tables mais je n'arrive pas a faire ce que je veux.

Je souhaiterais afficher une liste d'articles avec pour chaque article, le numéro, la date et le numéro de fournisseur de la dernière commande.

Comment faire ?
Ci dessous ma requete que j'ai simplifié pour qu'elle soit compréhensible
Mon problème c'est qu'elle affiche toute les lignes de commandes Fournisseur
SELECT
ARTICLE.CODEARTICLE AS CODEARTICLE ,
ARTICLE.CODECOMPLEMENTAIRE AS CODECOMPLEMENTAIRE ,
ARTICLE.LIBELLE1 AS LIBELLE1,
ARTICLE.LIBELLE2 AS LIBELLE2,
LIGNECOMMANDEFR.NUMERO
LIGNECOMMANDEFR.DATECDE
LIGNECOMMANDEFR.NUMFR
FROM
ARTICLE
LEFT OUTER JOIN LIGNECOMMANDEFR ON LIGNECOMMANDEFR .CODEARTICLE =ARTICLE.CODEARTICLE AND LIGNECOMMANDEFR .CODECOMPLEMENTAIRE =ARTICLE.CODECOMPLEMENTAIRE
WHERE
ORDER BY
CODEARTICLE ASC,
CODECOMPLEMENTAIRE ASC,
NUMERODESC
Miembro registrado
68 mensajes
Publicado el 14,marzo 2019 - 16:41
Personne pour m'aider?
Miembro registrado
13 mensajes
Publicado el 14,marzo 2019 - 18:24
as-tu essayer avec INNER JOIN... tu n'aura que ceux ayant concordance
Miembro registrado
72 mensajes
Publicado el 14,marzo 2019 - 19:15
Tu peux faire une sous-requête qui s'exécutera pour chaque ARTICLE.
Par contre, on ne peut pas sortir plus de 1 rubriques par sous-requêtes.
Donc il faudrait faire un TOP 1 et trier sur ta date de commande.
Par contre Windev ne nous permet pas de mettre une rubriques différentes dans la clause ORDER BY de celle dans les sous-requête, il nous renvoie une erreur comme de quoi il y plusieurs rubriques ce qui n'est pas le cas mais bon...

Une méthode de contourner ca ici est de faire un CONCAT(NumeroCmd, RubriqueVoulue) as MonConcat
et ensuite de faire un ORDERBY sur MonConcat par ordre Descendant, combiner avec le TOP 1, ca te retourne ta dernière commande.

Dans ton cas tu aurais 3 sous-requête à exécuter alors fait gaffe au performance si tu as beaucoup d'articles et / ou commandes, mais bon à première vu ceci pourrait régler ton problème

SELECT
ARTICLE.CODEARTICLE AS CODEARTICLE ,
ARTICLE.etc...,

(SELECT TOP 1
LIGNECOMMANDEFR.NUMERO as NumCmdConcat // Tu es déjà sur la bonne rubrique alors pas besoin de concat
FROM
LIGNECOMMANDEFR
WHERE
LIGNECOMMANDEFR.CODEARTICLE = ARTICLE.CODEARTICLE
ORDER BY
NumCmdConcat DESC
) as NumeroCmd,
(SELECT TOP 1
CONCAT(LIGNECOMMANDEFR.NUMERO, ';', LIGNECOMMANDEFR.DATECDE) as DateCmdConcat
FROM
LIGNECOMMANDEFR
WHERE
LIGNECOMMANDEFR.CODEARTICLE = ARTICLE.CODEARTICLE
ORDER BY
DateCmdConcat DESC
) as DateCmd,
(SELECT TOP 1
CONCAT(LIGNECOMMANDEFR.NUMERO, ';', LIGNECOMMANDEFR.NUMFR) as NumfrConcat
FROM
LIGNECOMMANDEFR
WHERE
LIGNECOMMANDEFR.CODEARTICLE = ARTICLE.CODEARTICLE
ORDER BY
NumfrConcat DESC
) as NumfrCmd
// etc...

FROM
ARTICLE

ORDER BY
CODEARTICLE ASC


Sinon tu pourrais aussi faire un Concat des 3 rubriques en commençant par ton numéro de commande pour pouvoir appliquer ton Top 1 (ceci te permettrais de gagner en performance car une seule sous-requête te retournant toute les rubriques dont tu as besoin.

Par contre il faudrait que tu fasse un ExtraitChaine() de tes 3 rubriques manuellement par la suite pour ressortir les résultats voulus

A toi de voir

En espérant t'avoir aider à régler ton problème :)
Miembro registrado
299 mensajes
Publicado el 16,marzo 2019 - 14:52
Ce serait intéressant d'avoir un retour.
Personnellement j'utilise peu HFSQL et cela m'intéresserait de savoir les performances de ce genre de solution