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 :

Une requête qui donne des doublons dans les résultats


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut Une requête qui donne des doublons dans les résultats
    Bonjour tous le monde
    Voilà ma requête SQL j'ai essayé de la rectifier mais elle me sort toujours des redondances dans le résultat
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    SELECT     GEcheance.Code_Affaire, Taffaire.IntituleAffaire, GEcheance.NumEcheance, GEcheance.DateEcheance, GEcheance.MontantEcheance, GEcheance.Facture, 
                          GEcheance.DateFact, GEcheance.NumFact, GEcheance.Regle, GEcheance.DateRegl, GEcheance.MontantRegl, GEcheance.ObsEcheance, Taffaire.code_agence, 
                          Taffaire.dent_dem, Taffaire.DateEtablConv, Taffaire.dapprob_conv, Taffaire.descript_projet, Taffaire.MaitreOuvrage, Taffaire.Typeouvrage, Taffaire.TypeSousouvrage, 
                          Taffaire.TypeCocontractant, Taffaire.Cocontractant, Taffaire.statut_aff, Taffaire.statut_ouv, Taffaire.chargedaffaire, Taffaire.MntTrvSoumis, Taffaire.RefRapport, 
                          Taffaire.ClotureREP, Taffaire.ClotureFicheOuvProjet, Taffaire.DateCreationAffaire, Taffaire.DateDerniereModifAffaire, Taffaire.UserCreationAffaire, 
                          Taffaire.UserDerniereModifAffaire, Taffaire.Multisite, Taffaire.SaisieIngenieur, Taffaire.DatePriseChargerAffActuel, Taffaire.MarcheN, Taffaire.ValidRensAffaireDir, 
                          Taffaire.DelaiContrat, Taffaire.PeriodeGrace, Taffaire.MontantContrat, Taffaire.ExistCaution, Taffaire.MontantCaution, Taffaire.MotifLiberCaution, 
                          Taffaire.SiReceptCaution, Taffaire.DateReceptCaution, Busers_1.GroupSec, Busers_1.GroupSousSec, Bagences.nom_ag, 
                          GChangementEtatConvention.EtatConvention, GChangementEtatConvention.DateFinEtat, MaxGAvancementChantier.MaxTauxAvancementChantier, 
                          MaxGAvancementPlan.MaxTauxAvancementPlan, GChangementEtatProjet.EtatProjet, Busers.Matricule AS MatIngControleur, 
                          Busers.Nom + ' ' + Busers.Prénom AS IngControleur, TSites.CodeWilaya, Bmaitre_ouvrage.nom AS NomMaitreouvrage, Bmaitre_ouvrage.Abrevation, 
                          Bmaitre_ouvrage.FamilleMouvrage, TEntreRealSite.codeEntreprise, TmaitreOeuvreSite.codeMaitreOeuvre, TBetSite.codeBET, Taffaire.AnneeCvt
    FROM         (SELECT     Code_Affaire, Code_site, MAX(EtatProjet) AS EtatProjet, DateFinEtat
                            FROM         GChangementEtatProjet AS GChangementEtatProjet_1
                            WHERE     (DateFinEtat IS NULL)
                            GROUP BY Code_Affaire, Code_site, DateFinEtat) AS GChangementEtatProjet RIGHT OUTER JOIN
                          (SELECT     Code_Affaire, Code_Site, MAX(codeBET) AS codeBet
                                 FROM         TBetSite
                                  WHERE     (codeBET LIKE '%CB00138%')
                                 GROUP BY Code_Affaire, Code_Site) AS TBetSite RIGHT OUTER JOIN
                          TSites ON TBetSite.Code_Affaire = TSites.Code_Affaire AND TBetSite.Code_Site = TSites.Code_Site LEFT OUTER JOIN
                          (SELECT     Code_Affaire, Code_Site, MAX(codeMaitreOeuvre) AS codeMaitreOeuvre
                                 FROM         TmaitreOeuvreSite
                                 WHERE     (codeMaitreOeuvre LIKE '%CA00138%')
                                 GROUP BY Code_Affaire, Code_Site) AS TmaitreOeuvreSite ON TSites.Code_Affaire = TmaitreOeuvreSite.Code_Affaire AND TSites.Code_Site = TmaitreOeuvreSite.Code_Site LEFT OUTER JOIN
                         (SELECT     Code_Affaire, Code_Site, MAX(codeEntreprise) AS codeEntreprise
                                 FROM         TEntreRealSite
                                 WHERE     (codeEntreprise LIKE '%CE00138%')
                                 GROUP BY Code_Affaire, Code_Site) AS TEntreRealSite ON TSites.Code_Affaire = TEntreRealSite.Code_Affaire AND TSites.Code_Site = TEntreRealSite.Code_Site LEFT OUTER JOIN
                              (SELECT     Code_Affaire, MAX(MatriculeSal) AS MatriculeSal, Code_Site
                                 FROM         TuserSite AS TuserSite_1
                                 WHERE     (ControleTrvExe = 1) AND (EtatSal = 'Actif')
                                 GROUP BY Code_Affaire, Code_Site) AS TuserSite INNER JOIN
                          Busers ON TuserSite.Code_Site = Busers.Matricule ON TSites.Code_Affaire = TuserSite.Code_Affaire AND TSites.Code_Site = TuserSite.Code_Site ON 
                          GChangementEtatProjet.Code_Affaire = TSites.Code_Affaire AND GChangementEtatProjet.Code_site = TSites.Code_Site LEFT OUTER JOIN
                              (SELECT     Code_Affaire, MAX(TauxAvancementPlan) AS MaxTauxAvancementPlan, Code_site
                                 FROM         GAvancementPlan
                                 GROUP BY Code_Affaire, Code_site) AS MaxGAvancementPlan ON TSites.Code_Affaire = MaxGAvancementPlan.Code_Affaire AND 
                          TSites.Code_Site = MaxGAvancementPlan.Code_site LEFT OUTER JOIN
                              (SELECT     Code_Affaire, MAX(TauxAvancementChantier) AS MaxTauxAvancementChantier, COUNT(Num) AS NbrVisiteApres310512, Code_site, 
                                                       Date AS datevisite
                                 FROM         GVisiteChantier
                                 GROUP BY Code_Affaire, Code_site, Date) AS MaxGAvancementChantier ON TSites.Code_Affaire = MaxGAvancementChantier.Code_Affaire AND 
                          TSites.Code_Site = MaxGAvancementChantier.Code_site RIGHT OUTER JOIN
                          Bmaitre_ouvrage INNER JOIN
                          GEcheance INNER JOIN
                          Taffaire ON GEcheance.Code_Affaire = Taffaire.Code_Affaire ON Bmaitre_ouvrage.code = Taffaire.MaitreOuvrage ON 
                          TSites.Code_Affaire = Taffaire.Code_Affaire LEFT OUTER JOIN
                              (SELECT     Code_Affaire, EtatConvention, DateFinEtat
                                 FROM         GChangementEtatConvention AS GChangementEtatConvention_1
                                 WHERE     (DateFinEtat IS NULL)
                                 GROUP BY Code_Affaire, EtatConvention, DateFinEtat) AS GChangementEtatConvention ON 
                          Taffaire.Code_Affaire = GChangementEtatConvention.Code_Affaire LEFT OUTER JOIN
                              (SELECT     Code_Affaire, EtatOperation, DateFinEtatOperation
                                 FROM         GChangementEtatOperation AS GChangementEtatOperation_1
                                 WHERE     (DateFinEtatOperation IS NULL)
                                 GROUP BY Code_Affaire, EtatOperation, DateFinEtatOperation) AS GChangementEtatOperation ON 
                          Taffaire.Code_Affaire = GChangementEtatOperation.Code_Affaire LEFT OUTER JOIN
                          Bagences ON Taffaire.code_agence = Bagences.code_ag LEFT OUTER JOIN
                          Busers AS Busers_1 ON Taffaire.chargedaffaire = Busers_1.Matricule

    Merci pour votre aide

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Et avec un SELECT DISTINCT ...

    Sinon, respectez la charte de postage
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    Merci pour votre réponse
    mais
    J'ai essayé avec DISTINCT
    mais ça ne marche pas ca me donne cette erreur
    Le type de données ntext ne peut pas être sélectionné en tant que DISTINCT, car il n'est pas comparable.
    ainsi qu'avec "Group by TAffaire.Code_Affaire " problème d’ambiguïté

  4. #4
    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,

    Passez vos colonnes ntext en nvarchar (voire en varchar)

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    Merci pour votre réponse
    Ce n'est pas si évident ...car cette BDD ainsi faite se trouve encore sur 8 serveurs ie n'importe quelle modification nécessite un travail immense sur les autres bases, et on parle de plusieurs tables ici et ce n'est pas aussi simple que ça.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Vous pouvez vous y prendre autrement en ne conservant dans un premier temps que les clefs des tables, faire le distinct dessus, puis rajouter les détails après. Cela devrait être beaucoup plus rapide en sus.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    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
    L'ideal serait de trouver l'origine de ces redondances, qui ne vous semble visiblement pas normales...

    Pour cela, vous pouvez faire un SELECT * pour trouver les colonnes qui changent, ça pourra aider à trouver la jointure qui provoque cela.

    Enfin en attendant, vous pouvez simplement transtyper les colonnes NTEXT dans le select (ainsi bien sur que dans le group by) afin de pouvoir ajouter le distinct

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    En sus, je vous invite à réécrire votre requête avec des CTE, ça en facilitera grandement la relecture surtout au niveau des jointures, où vous mélangez les RIGHT, les LEFT... je ne dis pas que c'est faux, mais en mixant les jointures droites et gauche c'est encore plus facile de commettre une erreur !

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/06/2009, 14h49
  2. Réponses: 7
    Dernier message: 09/02/2009, 14h28
  3. Requête pour supprimer des doublons dans une table
    Par nomade333 dans le forum Contribuez
    Réponses: 0
    Dernier message: 30/03/2008, 12h48
  4. Réponses: 8
    Dernier message: 26/01/2006, 14h47
  5. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03

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