Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Optimisation d'une requete dans une vue avec sous requetes

6 réponses
Avatar
jerome
Bonjour j'essaie d'optimiser une requete de ce type dans une vue.

Pour pouvoir récupérer mon id de la dernière facture ainsi que le numéro et
la date je suis obligé de faire 3 fois la même requete.
J'imagine qu'il doit être possible de récupérer les 3 champs dans une seule
requête (avec une jointure ?) mais je n'y arrive pas.

Et ceci sans passer par des insert dans une table temporaire car, si la
requete retourne de nombreux enregistrements, le temps d'exécution est
beaucoup trop long.

Meci pour votre aide.

CREATE view dbo.ViewFacture
as

select r2.*

,facture_id=(select top 1 facture_id from facture_ligne
inner join facture on facture.facture_id=facture_ligne.facture_id
where mouvementID=facture_ligne.factureLigne_id
order by factureLigne_id desc)

,facture_numero=(select top 1 facture_numero from facture_ligne
inner join facture on facture.facture_id=facture_ligne.facture_id
where mouvementID=facture_ligne.factureLigne_id
order by factureLigne_id desc)

,facture_date=(select top 1 facture_date from facture_ligne
inner join facture on facture.facture_id=facture_ligne.facture_id
where mouvementID=facture_ligne.factureLigne_id
order by factureLigne_id desc)

from

(
select TOP 100 percent r1.* from
(
select
,mouvementID
,marchandise
,solde = ...

from dbo.mouvements

group by ,mouvementID,marchandise
) r1

where r1.solde >0

)r2

6 réponses

Avatar
Gilles LE BARBIER
Salut jerome,

Que veut tu comme résultat

peut tu dire pour quoi tu fini par un top 100 sur une dernière requete ?

le rapport entre les table factures et mouvements

explique en littéral ton désire
Il est vrai que ta requete peut être facilement optimisée

Gilles
Avatar
jerome
Je veux pouvoir récupérer les données de la dernière facture sur la même
ligne qui regroupe la somme des mouvements pour un id marchandise.

Un mouvement pointe sur une ligne de facture qui pointe sur une facture

La somme des mouvement donne le total facturé et je veux récupérer ce total
et, sur la même ligne, afficher les données de la dernière facture (le order
by lignefactureId desc)

Il y a des TOP 100 percent car en fait la vue est plus compliquée que ça et
est appelée dans une SP qui se construit de manière dynamique en fonction de
paramètres utilisateurs.
Donc ne pas en tenir compte.

Ce que je souhaiterai savoir c'est comment éviter de faire 3 ou 4 fois la
même requête.

Merci


"Gilles LE BARBIER" wrote in message
news:%23vjy0tA%
Salut jerome,

Que veut tu comme résultat

peut tu dire pour quoi tu fini par un top 100 sur une dernière requete ?

le rapport entre les table factures et mouvements

explique en littéral ton désire
Il est vrai que ta requete peut être facilement optimisée

Gilles



Avatar
Gilles LE BARBIER
> Je veux pouvoir récupérer les données de la dernière facture sur la même
ligne qui regroupe la somme des mouvements pour un id marchandise.
Un mouvement pointe sur une ligne de facture qui pointe sur une facture


La somme de quoi

La somme des mouvement donne le total facturé et je veux récupérer ce
total
et, sur la même ligne, afficher les données de la dernière facture (le
order
by lignefactureId desc)



J'ai pas vu de somme !

Il y a des TOP 100 percent car en fait la vue est plus compliquée que ça
et
est appelée dans une SP qui se construit de manière dynamique en fonction
de
paramètres utilisateurs.
Donc ne pas en tenir compte.


Il faudra en tenir compte !!!


Ce que je souhaiterai savoir c'est comment éviter de faire 3 ou 4 fois la
même requête.


Voici une requete rapide mais comme je ne connais pas la structure des
tables
j'ai fais avec mon impression

les mouvements de la dernière facture

CREATE view dbo.ViewFacture
as

Select MO.*,FA.facture_id,FA.facture_numero,FA.facture_date from

from dbo.mouvements MO
JOIN facture_ligne FL ON FL.factureLigne_id = MO.mouvementID
JOIN facture FA on FA.facture_id = FL.facture_id
where MO.solde >0 AND FA.facture_id in (select MAX(facture_id) from
Facture )

Ecrit dans un autre sens

CREATE view dbo.ViewFacture
as

Select MO.*,FA.facture_id,FA.facture_numero,FA.facture_date from

from facture FA
JOIN facture_ligne FL ON FL.facture_id= FA.facture_id
JOIN mouvements MO ON MO.solde >0 AND MO.mouvementID =
FL.factureLigne_id
where FA.facture_id in (select MAX(facture_id) from Facture )
Avatar
SQLpro
Bonjour,

Gilles LE BARBIER a écrit :

> Ce que je souhaiterai savoir c'est comment éviter de faire 3 ou 4 foi s la
> même requête.



Si vous avez des requêtes identiques, utilisez la notion d'expression
de table (CTE : Common Table Expression). Mais ceci n'est possible
qu'avec la version 2005.

A +
Avatar
jerome
Merci beaucoup,

C'est effectivement ce que je cherchais. Beaucoup plus simple et plus
rapide.

Merci encore


"Gilles LE BARBIER" wrote in message
news:u13IvQB%
> Je veux pouvoir récupérer les données de la dernière facture sur la même
> ligne qui regroupe la somme des mouvements pour un id marchandise.
> Un mouvement pointe sur une ligne de facture qui pointe sur une facture
La somme de quoi

> La somme des mouvement donne le total facturé et je veux récupérer ce
> total
> et, sur la même ligne, afficher les données de la dernière facture (le
> order
> by lignefactureId desc)

J'ai pas vu de somme !

> Il y a des TOP 100 percent car en fait la vue est plus compliquée que ça
> et
> est appelée dans une SP qui se construit de manière dynamique en


fonction
> de
> paramètres utilisateurs.
> Donc ne pas en tenir compte.
Il faudra en tenir compte !!!


> Ce que je souhaiterai savoir c'est comment éviter de faire 3 ou 4 fois


la
> même requête.
Voici une requete rapide mais comme je ne connais pas la structure des
tables
j'ai fais avec mon impression

les mouvements de la dernière facture

CREATE view dbo.ViewFacture
as

Select MO.*,FA.facture_id,FA.facture_numero,FA.facture_date from

from dbo.mouvements MO
JOIN facture_ligne FL ON FL.factureLigne_id = MO.mouvementID
JOIN facture FA on FA.facture_id = FL.facture_id
where MO.solde >0 AND FA.facture_id in (select MAX(facture_id)


from
Facture )

Ecrit dans un autre sens

CREATE view dbo.ViewFacture
as

Select MO.*,FA.facture_id,FA.facture_numero,FA.facture_date from

from facture FA
JOIN facture_ligne FL ON FL.facture_id= FA.facture_id
JOIN mouvements MO ON MO.solde >0 AND MO.mouvementID > FL.factureLigne_id
where FA.facture_id in (select MAX(facture_id) from Facture )



Avatar
Gilles LE BARBIER
pas pb !

A+

Gilles