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 :

Double Doublons relatif


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Double Doublons relatif
    Bonjour,
    j'ai besoin d'aide sur la construction d'une requete sous informix 7.
    J'ai une table p_prtcod (4 colonnes col_1 à col_4) avec des données :
    col_1;col_2;col_3;col_4
    34;1;"LONG";M
    34;6;"ABS";M

    36;1;"LONG";M
    36;6;"ABS";M

    37;1;"LONG";M
    37;6;"ABS";M
    37;12;"DIV";M

    38;1;"LONG";M
    38;6;"ABS";M
    38;12;"DIV";M
    38;15;"ZERO";M

    137;1;"LONG";M
    137;6;"ABS";M
    137;12;"DIV";M
    137;15;"ZERO";M

    Et donc je souhaite avoir 34 et 36 mais pas 37 ainsi que 38 et 137. Avec le code suivant qui recherche les doublons relatifs j'obtiens trop de résultats.
    Il faut que :
    T1.col_1<>T2.col_1 and
    T1.col_2=T2.col_2 and
    T1.col_4=T2.col_4 and ???? afin qu'il soit au moins >=2 et qu'il est le même nombre.
    Est ce clair ?
    J'ai un code pour trouver les doublons mais il est loind d'être complet sauf qu'en réfléchissant il me semble que ce que je souhaite soit impossible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT DISTINCT *
    FROM   p_prtcod T1
    WHERE  EXISTS (SELECT *
                   FROM   p_prtcod T2
                   WHERE  T1.col_1<> T2.col_1
                     AND  T1.col_2= T2.col_2
                     AND  T1.col_4= T2.col_4)
    Est ce possible de faire cela?
    MErci d'avance.

  2. #2
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Et donc je souhaite avoir 34 et 36 mais pas 37 ainsi que 38 et 137.
    Ta phrase est ambigue.
    "ainsi que 38 et 137" n'est pas clair Que doit-on lire ? :
    "Et donc je souhaite avoir 34 et 36 mais ni 37 ni 38 ni 137. "
    ou
    "Et donc je souhaite avoir 34 et 36 et 38 et 137 mais pas 37. "

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par gomodo Voir le message
    Ta phrase est ambigue.
    "ainsi que 38 et 137" n'est pas clair Que doit-on lire ? :
    "Et donc je souhaite avoir 34 et 36 mais ni 37 ni 38 ni 137. "
    ou
    "Et donc je souhaite avoir 34 et 36 et 38 et 137 mais pas 37. "
    Oui pardon.
    C'est donc
    Et donc je souhaite avoir 34 et 36 et 38 et 137 mais pas 37

  4. #4
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    A part le nombre d'élément (3 enregistrements pour col_1=37), je ne vois pas sur quel critère on peut différencier les enregistrements 37 des autres.

    La bonne question est :

    Quelle définition exacte donne-tu à un "Doublon relatif" ?
    ou si tu trouve plus simple :
    Pourquoi les enregistrements 37 ne sont pas "Doublon relatif" ?
    ou inversement : pourquoi les autres le sont ?

  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
    Quelque chose comme ça ?
    Même nombre de lignes pour chaque col_1 et valeurs communes pour toutes ces lignes...
    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
    SELECT  cnt1.col_1
        ,   cnt2.col_1
    FROM    (   SELECT  t1.col_1
                    ,   COUNT(*)    AS cnt
                FROM    matable as t1
                GROUP BY t1.col_1
            )   AS cnt1
        INNER JOIN
            (   SELECT  t2.col_1
                    ,   COUNT(*)    AS cnt
                FROM    matable AS t2
                GROUP BY t2.col_1
            )   AS cnt2
            ON  cnt1.cnt    = cnt2.cnt
            AND cnt1.col_1  > cnt2.col_1
        INNER JOIN
            (   SELECT  t3.col_1    AS id1
                    ,   t4.col_1    AS id2
                    ,   count(*)    AS cnt
                FROM    matable AS t3
                    INNER JOIN
                        matable AS t4
                        ON  t3.col_1    > t4.col_1
                        AND t3.col_2    = t4.col_2
                        AND t3.col_3    = t4.col_3
                        AND t3.col_4    = t4.col_4
                GROUP BY t3.col_1
                    ,   t4.col_1
            )   AS  chps
            ON  cnt1.cnt    = chps.cnt
            AND cnt1.col_1  = chps.id1
            AND cnt2.col_1  = chps.id2
    ;
    Il y a certainement quelque chose de plus simple

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par gomodo Voir le message
    A part le nombre d'élément (3 enregistrements pour col_1=37), je ne vois pas sur quel critère on peut différencier les enregistrements 37 des autres.

    La bonne question est :

    Quelle définition exacte donne-tu à un "Doublon relatif" ?
    ou si tu trouve plus simple :
    Pourquoi les enregistrements 37 ne sont pas "Doublon relatif" ?
    ou inversement : pourquoi les autres le sont ?
    Justement les criteres de distinction est le nombre.
    Pour mois un doublon relatif c'est 2 lignes identiques à une colonne pres.
    Donc ce que je recherche ce n'est pas exacetement les doublons relatifs - mon premier code les ramenes- car il faut aussi qu'il y est la même quantité d'égalité entre eux. C'est pour cela que 37 n'est pas valable.
    Ainsi c'est relatif parce que 34<> 36 (t1.col_1<>t2.col_1 et t1.col_2=t2.col_2 et t1=t2 et count(t1)=count(t2))
    donc 34 et 36 OK et 37 n'est pas bon, au moins pour 34 et 36.

    34;1;"LONG";M
    34;6;"ABS";M

    36;1;"LONG";M
    36;6;"ABS";M

    37;1;"LONG";M
    37;6;"ABS";M
    37;12;"DIV";M

    C'est à cause de l'égalité des count que j'ai pensé que c'était impossible a faire.

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Quelque chose comme ça ?
    Même nombre de lignes pour chaque col_1 et valeurs communes pour toutes ces lignes...
    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
    SELECT  cnt1.col_1
    FROM    (   SELECT  t1.col_1
                    ,   COUNT(*)    AS cnt
                FROM    matable as t1
                GROUP BY t1.col_1
            )   AS cnt1
        INNER JOIN
            (   SELECT  t2.col_1
                    ,   COUNT(*)    AS cnt
                FROM    matable AS t2
                GROUP BY t2.col_1
            )   AS cnt2
            ON  cnt1.cnt    = cnt2.cnt
            AND cnt1.col_1  > cnt2.col_1
        INNER JOIN
            (   SELECT  t3.col_1    AS id1
                    ,   t4.col_1    AS id2
                    ,   count(*)    AS cnt
                FROM    matable AS t3
                    INNER JOIN
                        matable AS t4
                        ON  t3.col_1    > t4.col_1
                        AND t3.col_2    = t4.col_2
                        AND t3.col_3    = t4.col_3
                        AND t3.col_4    = t4.col_4
                GROUP BY t3.col_1
                    ,   t4.col_1
            )   AS  chps
            ON  cnt1.cnt    = chps.cnt
            AND cnt1.col_1  = chps.id1
            AND cnt2.col_1  = chps.id2
    ;
    Il y a certainement quelque chose de plus simple
    J'essaye de combler les trous pour voir si c'est ok.
    En tout cas merci pour tout.

Discussions similaires

  1. Réponses: 12
    Dernier message: 02/01/2012, 19h38
  2. requete de delete de doublons relatifs
    Par caweb dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/01/2008, 11h26
  3. Réponses: 5
    Dernier message: 18/09/2007, 11h12
  4. Eradication doublons relatifs et optimisation table
    Par boby67 dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/06/2007, 03h04
  5. REQUETE : élimination des doublons relatifs
    Par Fejitatete dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/06/2007, 14h42

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