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 :

[prendre des doublons]


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2004
    Messages : 327
    Points : 487
    Points
    487
    Par défaut [prendre des doublons]
    Bonjour,

    Un petit problème ou il faut prendre des doublons !!
    Avec la table suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    col_1 | col_2 |   
    ---------------   
    1     | 45    |   
    2     | 45    |   
    3     | 46    |   
    3     | 46    |   
    4     | 47    |
    Je veux récuperer les identifiants numeriques de col_2 tels que :
    - il existe au moins 2 valeurs identiques dans col_2
    - les valeurs de col_1 doivent être differentes.

    Dans l'exemple, il faut que je recupere la valeur 45 uniquement car :
    - Cette valeur est presente deux fois et les valeurs des deux lignes concernées sont differentes (1 et 2)
    - La valeur 46 n'est pas récupéré car les valeurs de col_1 sont les mêmes (3)
    - La valeur 47 n'est pas prise car elle est unique.
    un group by( col_2) avec having (count(*)>1) me permet de ne prendre que les lignes ou les valeurs dans col_2 apparaissent en double mais comment ne prendre QUE les lignes ou les valeurs sont differentes dans col_1 ?

  2. #2
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    slt.

    en terme de perf, ca doit pas etre terrible, mais avec des indexes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    SELECT d.col_1,d.col_2 FROM table d,table s where 
    (d.col_1<>s.col_1 and d.col_2=s.col_2) group by d.col_1,d.col_2;

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Simple :

    Décomposition...

    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
    CREATE TABLE T_BIDULE
    (col_1 int, col_2 int)
     
    INSERT INTO T_BIDULE VALUES (1, 45)
    INSERT INTO T_BIDULE VALUES (2, 45)
    INSERT INTO T_BIDULE VALUES (3, 46)
    INSERT INTO T_BIDULE VALUES (3, 46)
    INSERT INTO T_BIDULE VALUES (4, 47)
     
    -- visibilité des comptage :
    SELECT *, 
            (SELECT COUNT(*) 
             FROM   T_BIDULE 
             WHERE  col_2 = T.col_2) AS nb_col2_identique,
            (SELECT COUNT(DISTINCT col_1) 
             FROM   T_BIDULE 
             WHERE  col_2 = T.col_2) AS nb_col1_different
    FROM   T_BIDULE AS T 
     
    col_1       col_2       nb_col2_identique nb_col1_different 
    ----------- ----------- ----------------- ----------------- 
    1           45          2                 2
    2           45          2                 2
    3           46          2                 1
    3           46          2                 1
    4           47          1                 1
     
    -- encapsulation dans requête finale :
    SELECT DISTINCT col_2
    FROM   (SELECT *, 
                   (SELECT COUNT(*) 
                    FROM   T_BIDULE 
                    WHERE  col_2 = T.col_2) AS nb_col2_identique,
                   (SELECT COUNT(DISTINCT col_1) 
                    FROM   T_BIDULE 
                    WHERE  col_2 = T.col_2) AS nb_col1_different
            FROM   T_BIDULE AS T ) AS TT
    WHERE  nb_col2_identique > 1
      AND  nb_col1_different > 1 
     
    col_2       
    ----------- 
    45
    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/ * * * * *

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Salut,

    voilà:
    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
     
     
    select DISTINCT l.col_2
    from myTable l inner join 
    (--dans les doublons de col_2, on ne garde que ceux qui n'ont qu'une col_1
    	select m.col_1
    	from myTable m inner join 
    	( --recherche des doublons col_2
    		select col_2 
    		from myTable 
    		group by Col_2 
    		having (count(col_2) > 1)
    	) t
    	on m.col_2 = t.col_2
    	group by m.col_1
    	having (count(m.col_1) = 1)
    ) r
    on l.col_1 = r.col_1

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2004
    Messages : 327
    Points : 487
    Points
    487
    Par défaut
    Bonjour,

    Merci à tous.

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

Discussions similaires

  1. [Batch] Prendre des mesures avec iperf
    Par bloody_death dans le forum Windows
    Réponses: 2
    Dernier message: 08/02/2005, 15h12
  2. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 14h27
  3. 1 Table, Des doublons, ne rertenir que certains d'entre eux
    Par Dragano dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/01/2005, 12h06
  4. Effacer des doublons
    Par ben53 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/07/2004, 17h56
  5. Réponses: 2
    Dernier message: 07/07/2004, 17h44

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