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

MS SQL Server Discussion :

[MS SQL SERVER 7.0]Doublons lors d'une requête


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 24
    Points
    24
    Par défaut [MS SQL SERVER 7.0]Doublons lors d'une requête
    Bonjour,

    je n'arrive pas à avoir des lignes uniques sur le champ O.Id de mon résultat pour la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    SELECT distinct	O.Id,
    		A.Id,
    		A.Name,
    		O.Name,
    		O.CreatedById,
    		O.OwnerId,
    		O.Source_opportunite_c,
    		O.Autre_source_c,
    		A.MIPS_c,
    		O.IsClosed,
    		O.StageName,
    		H.closeDate,
    		O.Date_d_Ech_ance_c,
    		O.New_Expanded_Renewal_c,
    		O.Commentaires_c
    FROM OMS_opportunity O
    INNER JOIN OMS_account A
    ON O.accountId = A.Id
    INNER JOIN opportunityHistory H
    ON O.Id = H.opportunityId AND O.StageName = H.stageName
    J'ai pourtant mis un Distinct mais je pense que le problème vient des jointures.

    Merci pour votre aide !

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    En effet, tu demandes un DISTINCT de toutes les lignes, pas seulement de o.Id.
    Tu peux essayer un GROUP BY o.Id, mais si tu as des doublons dûs à tes jointures, il te faux regarder pourquoi, et décider quoi faire pour toutes les autres colonnes qui vont être différentes, par exemple prendre la plus petite ou plus grande valeur avec un MIN() ou MAX(). Tu me suis ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Merci pour ta réponse.
    J'ai contourné le problème avec l'instruction "TOP 1" mais je galère un peu sur l'intruction "MAX" que je dois utiliser car je ne veux pas trier ma table avant.

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Est-il possible de masquer un des champs dans un select. J'ai une sous-requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT H.closeDate
    FROM opportunityHistory H
    WHERE O.Id = H.opportunityId AND O.StageName = H.stageName
    que je voudrais mettre dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT H.closeDate, MAX(H.createdDate)
    ....
    mais sans imprimer le champ createdDate car le résultat de ma sous-requête doit être renvoyé que dans un seul champ.

    Si vous n'avez rien compris je peux le refaire ...

  5. #5
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Si j'ai bien compris ce que tu veux, tu peux toujours faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT H.closeDate
    FROM opportunityHistory H
    WHERE O.Id = H.opportunityId AND O.StageName = H.stageName
    GROUP BY H.closeDate
    sans ajouter l'autre colonne dans ton SELECT.

    Ceci dit il doit manquer une table (alias O) dans ton exemple.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Sorry Rudib, j'me suis fait mal comprendre.

    En fait j'aimerais pouvoir récupérer le closeDAte qui a le createdDate le plus grand. Mais je veux que mon SELECT ne me renvoie qu'un singleton.
    C'est pour ça que je suis embêté par l'instruction MAX car je suis obligé de le mettre dans mon SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT closeDate, MAX(createdDate) FROM ...
    qui me renverra un couple et non un singleton.
    J'ai trouvé un solution qui est de créer une requête imbriquée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT closeDate FROM ... 
    WHERE  createdDate = ( SELECT MAX(createdDate) FROM ... )
    mais point de vue performance c'est pas trop ça.

    Si je trouve rien d'autre, je prendais ça.
    Merci à toi pour ton esprit d'entraide !

  7. #7
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Effectivement tu peux faire comme ça, ou comme ceci, qui peut être meilleur en perfs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
                    H.stageName
    		T.MaxCreatedDate,
    		H.closeDate
    FROM dbo.opportunityHistory H
    JOIN (SELECT MAX(CreatedDate) as MaxCreatedDate, stageName FROM dbo.opportunityHistory GROUP BY stageName) T
    ON H.StageName = T.stageName
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

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

Discussions similaires

  1. [2005] probléme de cnx avec sql server ainsi que les éxécusion d'une requéte
    Par mariem deve dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 08/04/2013, 13h20
  2. [SQL SERVER 2005] tracer l'exécution d'une requête
    Par AllyKo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/05/2008, 09h10
  3. [sql server]2 colonnes identiques lors du résultat d'une requête.
    Par maxlegrand dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/06/2007, 22h59
  4. [SQL SERVER 2000][Trigger] Pb lors de l'execution du trigger
    Par mcousse dans le forum Développement
    Réponses: 4
    Dernier message: 24/11/2006, 11h25
  5. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 15h24

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