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

Développement SQL Server Discussion :

Supprimer doublons obtenus avec left outer join


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    DSI
    Inscrit en
    Mars 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mars 2009
    Messages : 102
    Par défaut Supprimer doublons obtenus avec left outer join
    Bonjour,

    Je travaille sur les données un peu pourries d'un ERP franchement nul pour alimenter un datamart qui fournit un cube.
    (SQL Server 2005)

    Soit une table STOCK comprenant:

    Item......NumEntrée.....Qté
    -------..----------......-----
    A..........1..................5
    B..........2..................3
    C..........3..................2

    Soit une table Entrées comprenant:
    NumEntrée.....Date
    ----------.....-----------
    1.................2010/01/01
    2.................2010/02/01
    3.................2010/03/01

    Pour calculer mes stocks à date j'utilise (avec satisfaction depuis 5 ans) la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select Item, NumEntrée, Qté, isnull(date,getdate()) 
      from stock 
           left outer join entrées 
             on stock.numentrée = entrées.numentrée
    Qui me donne le résultat suivant:
    Item......NumEntrée....Qté......Date
    -------..----------...-----.....-----------
    A......................1......5.......2010/01/01
    B......................2......3.......2010/02/01
    C......................3......2.......2010/03/01


    Un intégrateur Fou a vérolé la table Entrée. Je me retrouve avec une table entrée doublonnée:

    NumEntrée..........Date
    ----------..........-----------
    1......................2010/01/01
    2......................2010/02/01
    2......................2010/02/20
    3......................2010/03/01

    Et ma requête stock à date me retourne:
    Item......NumEntrée.....Qté.......Date
    -------..----------..-----......-----------
    A......................1......5.......2010/01/01
    B......................2......3.......2010/02/01
    B......................2......3.......2010/02/20
    C......................3......2.......2010/03/01

    Je tourne et retourne le problème depuis longtemps et ne trouve pas de solution pour résoudre ce soucis sans reprendre complètement ma requête (qui est bien sur beaucoup plus complexe que ce qui est affiché) ce qui me prendrait beaucoup de temps.

    La solution la + simple que j'ai trouvé est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select Item, NumEntrée, Qté, 
           isnull(select max(date) from entrées where stock.numentrée = entrées.numentrée,getdate())
      from stock
    Mais cela augmenterait, je pense, considérablement les temps d'extraction.

    Auriez vous une autre solution ?

  2. #2
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Ca va être dur de modifier peu ta requête...

    Cela dit, tu peux utiliser les fonctions analytiques pour ne garder qu'une ligne par id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT * 
    FROM (
    SELECT   Item, NumEntrée, Qté, isnull(date,getdate()), ROW_NUMBER() OVER(PARTITION BY stock .item ORDER BY entrées.date DESC) rk
    		        FROM stock 
    			LEFT OUTER JOIN entrées 
    			ON stock.numentrée = entrées.numentrée
    ) t
    WHERE rk = 1

  3. #3
    Membre confirmé
    Profil pro
    DSI
    Inscrit en
    Mars 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mars 2009
    Messages : 102
    Par défaut
    Bonjour,

    Merci à PACMAN pour sa réponse.

    Je ne connais pas les fonctions analytiques. Mais je vais étudier.

    Cependant, quid des performances de ce genre d'astuce ???

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par BoromSikim Voir le message
    Bonjour,
    Mais cela augmenterait, je pense, considérablement les temps d'extraction.
    Non.
    Vous pouvez bel et bien utiliser ce query sans soucis.

Discussions similaires

  1. problème avec LEFT OUTER JOIN
    Par tofque dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/03/2008, 11h57
  2. [Optimisation] Requete trop lourde avec Left outer join...
    Par batosai dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/05/2006, 13h40
  3. Probleme de NULL avec LEFT OUTER JOIN
    Par jiluc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/01/2006, 14h42
  4. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  5. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17

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