IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Jointure : Appel fonction dans select uniq. pour le parent


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 174
    Points
    174
    Par défaut Jointure : Appel fonction dans select uniq. pour le parent
    Bonjour,

    J'ai 1 table "Factures" et 1 autre "factures_lignes"
    La requête pour imprimer 1 facture contenant 15 articles me retourne 15 lignes en répétant 15 fois les infos de la facture (N°, date, client...) (FROM Factures INNER JOIN factures_lignes).
    Parmis les colonnes qui doivent figurer sur la facture, 3 sont calculées via 1 fonction assez lourde (disons par exemple des stats sur les achats précédents du client qui figurent en pied de facture).
    Ex. : Select F.Num, F.Date, fnPalmares(1), fnPalmares(2), fnPalmares(3), FL.Article, FL.Pu, FL.Quant
    Comment éviter de calculer x fois ces colonnes (15 dans cet exemple) pour chaque facture.
    (en réalité la requête me retourne toutes les factures du mois (de 200 à 1000) ce qui accroit le problème mais j'ai parlé d'1 pour simplifier)

    J'ai appelé la fonction dans le select mais c'est très long.
    J'ai essayé de faire 1 OUTER APPLY dans le FROM mais c'est identique (je pense que ça revient au même que ci-dessus : la requête est calculée pour chaque ligne).
    J'ai essayé d'écrire dans une table temporaire sans exécuter les fonctions (mis 0 aux emplacements prévus) puis parcourir cette table groupée par N° de facture avec calcul des fn et update des lignes...aucun gain.
    Le temps gagné par l'appel unique est perdu par le travail du curseur et des mises à jour successives de chaque facture.

    Si vous avez 1 solution Merci pour votre aide.
    (J'utilise SQL Server 2008 R2 mais je peut upgrader si nécessaire)

    PS : désolé si le titre n'est pas très explicite, pas facile d'expliquer en peu de mots...

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Votre énoncé n'est pas clair, il faut que vous décriviez
    • vos tables (nom des colonnes, type, null/not null, PK, FK) et leurs index, le plus simple étant de fournir le DDL
    • les champs qui doivent apparaitre sur la facture
    • les règles de gestion à appliquer pour calculer les champs de la facture à partir des différentes colonnes de vos tables

    Puis un exemple de jeu de données en entrée et de résultat attendu
    A partir de là, une solution SQL peut être proposée

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il faut vous assurer que vos fonctions soient déterministes afin qu'elles ne soient pas exécutées plusieurs fois.
    Pensez aussi tables en ligne qui pourraient être plus performantes.

    Avec le code de votre requete et de vos fonctions, on pourrait mieux vous aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Grosse jointure versus subselect dans select ?
    Par batin dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2006, 14h47
  2. popup et appel fonction dans fentre parent
    Par wehtam dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/11/2006, 17h25
  3. Réponses: 5
    Dernier message: 04/05/2006, 16h38
  4. Pb appel fonction dans une lib
    Par mamok dans le forum MFC
    Réponses: 14
    Dernier message: 01/02/2006, 19h40
  5. PB pour Appel fonction dans DLL sur Builder3
    Par Fbartolo dans le forum C++Builder
    Réponses: 15
    Dernier message: 10/03/2005, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo