Optimisation d'une requete dans une vue avec sous requetes
6 réponses
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 = ...
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
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
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" <glebarbier@segilog.com> wrote in message
news:%23vjy0tA%23GHA.4712@TK2MSFTNGP03.phx.gbl...
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
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
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 )
> 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 )
> 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 )
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 +
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.
> 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 +
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 )
Merci beaucoup,
C'est effectivement ce que je cherchais. Beaucoup plus simple et plus
rapide.
Merci encore
"Gilles LE BARBIER" <glebarbier@segilog.com> wrote in message
news:u13IvQB%23GHA.3352@TK2MSFTNGP03.phx.gbl...
> 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 )
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 )