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 :

[SQL Server 2005] P'tit soucis de doublons cachés


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut [SQL Server 2005] P'tit soucis de doublons cachés
    Bonjour

    Bon, voilà, là je suis coincée sur une requête, j'ai pas la bosse du SQL.

    J'ai 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
    (Select distinct TPAT_PAT_IPP, TPAT_PAT_NOM, TPAT_PAT_PRE, TPAT_PAT_SEX, TPAT_DAT_NAI, '0' as TCSM_COD_TRI
    FROM TPAT
    LEFT JOIN TSUM ON TPAT_PAT_IPP = TSUM_PAT_IPP
    LEFT JOIN TCSM ON TSUM_SUM_NUM = TCSM_SUM_NUM
    WHERE TCSM_COD_TRI!=1 OR TCSM_COD_TRI IS NULL)
    UNION
    (Select distinct TPAT_PAT_IPP, TPAT_PAT_NOM, TPAT_PAT_PRE, TPAT_PAT_SEX, TPAT_DAT_NAI, TCSM_COD_TRI
    FROM TPAT
    LEFT JOIN TSUM ON TPAT_PAT_IPP = TSUM_PAT_IPP
    LEFT JOIN TCSM ON TSUM_SUM_NUM = TCSM_SUM_NUM
    WHERE TCSM_COD_TRI=1)
    Sachant que ma table TPAT n'a que 160796 lignes alors que cette requête m'en retourne 160822. Bon, là moi je me dis, c'est pas grave, on va aller voir ce qui cloche..., je remplace mon petit UNION par un INTERSECT | EXCEPT. Bah là, j'ai SQL Server 2005 qui m'envoie bouler... J'ai dû mal écrire ma requête, je ne vois que ça, parce que là il y a forcément des lignes en double et je ne sais pas où.

    Voilà donc si quelqu'un a la solution, je suis preneuse Surtout que cette requête me bloque pour mon package SSIS.

    Ahlala, pas douée moi aujourd'hui. Merci d'avance.

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par titecaro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (Select distinct TPAT_PAT_IPP, TPAT_PAT_NOM, TPAT_PAT_PRE, TPAT_PAT_SEX, TPAT_DAT_NAI, '0' as TCSM_COD_TRI
    FROM TPAT
    LEFT JOIN TSUM ON TPAT_PAT_IPP = TSUM_PAT_IPP
    LEFT JOIN TCSM ON TSUM_SUM_NUM = TCSM_SUM_NUM
    WHERE TCSM_COD_TRI!=1 OR TCSM_COD_TRI IS NULL)
    UNION
    (Select distinct TPAT_PAT_IPP, TPAT_PAT_NOM, TPAT_PAT_PRE, TPAT_PAT_SEX, TPAT_DAT_NAI, TCSM_COD_TRI
    FROM TPAT
    LEFT JOIN TSUM ON TPAT_PAT_IPP = TSUM_PAT_IPP
    LEFT JOIN TCSM ON TSUM_SUM_NUM = TCSM_SUM_NUM
    WHERE TCSM_COD_TRI=1)
    je remplace mon petit UNION par un INTERSECT | EXCEPT. Bah là, j'ai SQL Server 2005 qui m'envoie bouler...
    Il dit quoi ?




    D'ailleurs pourquoi tu fais un UNION ?

    Je serais tenté de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT 
    TPAT_PAT_IPP, TPAT_PAT_NOM, 
    TPAT_PAT_PRE, TPAT_PAT_SEX, 
    TPAT_DAT_NAI, TCSM_COD_TRI
    FROM TPAT
    LEFT JOIN TSUM ON TPAT_PAT_IPP = TSUM_PAT_IPP
    LEFT JOIN TCSM ON TSUM_SUM_NUM = TCSM_SUM_NUM
    WHERE TCSM_COD_TRI=1 AND (TCSM_COD_TRI!=1 OR TCSM_COD_TRI IS NULL)

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Tu pourrais simplement écrire ta requête comme ça :
    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
    select distinct 
            TPAT_PAT_IPP
        ,    TPAT_PAT_NOM
        ,    TPAT_PAT_PRE
        ,    TPAT_PAT_SEX
        ,    TPAT_DAT_NAI
        ,    case when TCSM_COD_TRI = 1 then TCSM_COD_TRI else 0 end as TCSM_COD_TRI
    from     TPAT
        left join 
            TSUM 
            on    TPAT_PAT_IPP = TSUM_PAT_IPP
        left join 
            TCSM 
            on    TSUM_SUM_NUM = TCSM_SUM_NUM
    ;
    Quant à tes problèmes de doublons, ils viennent peut être du fait qu'il ya plusieurs enregistrements dans TSUM ou TCSM pour un seul dans TPAT...

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Al1_24, c'est ce que je viens juste de faire ^^, j'ai modifié ma requête pour qu'elle soit un peu plus lisible et un pote que j'ai contacté m'a dit la même chose que toi par rapport à TCSM et TSUM....

    La question est de savoir comment il faut que je fasse pour éliminer ces enregistrements à l'intérieur de ma requête, tout en gardant la principe de la jointure gauche...

    En tout cas, merci de vos réponses rapides.

    Pour Mathusalem, je faisais comme ça car je mets à jour un flag en fonction de la valeur de TCSM_COD_TRI (qui elle peut aller jusqu'à 6).

    Juste pour la blague, j'essaie de savoir si un mec est mort ou pas. Ca le fait, hein ?

    Petit complément: J'essaie de contourner le truc en créant une vue avec cette requête, que je pourrais triturer après mais je bosse sur des serveurs différents...

    Là je veux créer ma vue sur le serveur1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW Patients
    as
    Select distinct TPAT_PAT_IPP, TPAT_PAT_NOM, TPAT_PAT_PRE, TPAT_PAT_SEX, TPAT_DAT_NAI, CASE WHEN TCSM_COD_TRI = 1 THEN TCSM_COD_TRI ELSE 0 END as TCSM_COD_TRI
    FROM server2\SQLSERVER2000.base.dbo.TPAT
    LEFT JOIN TSUM ON TPAT_PAT_IPP = TSUM_PAT_IPP
    LEFT JOIN TCSM ON TSUM_SUM_NUM = TCSM_SUM_NUM
    Mais je me retrouve avec l'erreur : Syntaxe incorrecte vers '\'.
    Bref, on verra ça demain matin hein...

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Et avec un petit regroupement ?
    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
    select    TPAT_PAT_IPP
        ,    TPAT_PAT_NOM
        ,    TPAT_PAT_PRE
        ,    TPAT_PAT_SEX
        ,    TPAT_DAT_NAI
        ,    max(case when TCSM_COD_TRI = 1 then TCSM_COD_TRI else 0 end) as TCSM_COD_TRI
    from     TPAT
        left join 
            TSUM 
            on    TPAT_PAT_IPP = TSUM_PAT_IPP
        left join 
            TCSM 
            on    TSUM_SUM_NUM = TCSM_SUM_NUM
    group by
            TPAT_PAT_IPP
        ,    TPAT_PAT_NOM
        ,    TPAT_PAT_PRE
        ,    TPAT_PAT_SEX
        ,    TPAT_DAT_NAI
    Tu peux aussi utiliser min()

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2004
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Et voilà, le génie masculin a encore frappé !

    Merci de votre aide, j'vais tester ça aussi sur les autres requêtes où j'avais des problèmes similaires.

    Bonne journée !

    Caro, Blonde power

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/10/2011, 18h36
  2. [SQL Server 2005] DELETE sur des doublons
    Par Shakta dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/05/2007, 12h13

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