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 :

débutant SQL : DISTINCT


Sujet :

Langage SQL

  1. #1
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 952
    Points
    1 952
    Par défaut débutant SQL : DISTINCT
    Bonjour,
    J'ai fait des recherches sur le net mais impossible d'avoir des précisions sur DISTINCT
    Quelle est la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select disctinct col1 col2 from matable
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select disctinct col1, col2 from matable
    Comment faire pour récupérer les valeurs de col1 et col2 en sélectionnant que les lignes dont la valeur de col1 est différente ?
    Merci

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    tout depend de ce que tu veux récupérer.

    Si tu as cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    col 1 col 2
    1       1
    1       3
    tu dois donc récupérer une seule ligne mais laquelle?

    Si cela n'a pas dimportance, tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select  col1, col2 from matable group by col1

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Points : 253
    Points
    253
    Par défaut
    Pour moi
    select disctinct col1 col2 from matable
    ne peux pas être valide puisqu'il est necessaire de séparer les deux champs par une virgule.

    Pour l'utilisation du disctinct celui-ci permet d'éviter d'avoir des doublons dans une même colonne.

    Par contre, je n'ai pas compris ceci
    Comment faire pour récupérer les valeurs de col1 et col2 en sélectionnant que les lignes dont la valeur de col1 est différente ?
    Tu veux afficher les col1 et col2 seulement si col1 est différent de col2, c'est ça ???
    Dans ce cas, une simple requête avec une codition where suffit.
    Du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select col1, col2
    From table
    Where col1 <> col2

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Ces deux requêtes n'ont rien à voir...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select disctinct col1 col2 
    from matable
    en fait peut être récrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select disctinct col1 AS col2
    from matable
    et signifie que la colonne col1 sera renommée col2 à l'affichage.
    Il n'y aura donc qu'une seule colonne dans la table résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select disctinct col1, col2 from matable
    ramène deux colonne en éliminant les doublons.

    Un doublons est une ligne dont TOUTES LES VALEURS sont identique à une autre.

    L'opérateur DISTINCT porte sur la ligne et non pas sur telle ou telle colonne comme le pense trop souvent certains profanes.

    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/select/#L1.2

    A +

  5. #5
    Membre habitué Avatar de relivio
    Profil pro
    Inscrit en
    Février 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 157
    Points : 177
    Points
    177
    Par défaut
    Bonjour,

    Juste une petite parenthèse

    Citation Envoyé par Cybher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select  col1, col2 from matable group by col1
    Ceci ne fonctionnera pas car il faut une fonction de regroupement sur col2.

    Ensuite, je n'ai pas fait de recherches mais je pense que le DISTINCT doit être clairement expliqué sur beaucoup de sites? rien que sur celui-ci.


    Oliv'

  6. #6
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 952
    Points
    1 952
    Par défaut
    Merci à tous pour votre aide, en fait
    select distinct col1,col2 from matable ne correspond pas à ce que je veux faire car il me faut afficher le contenu de col1 et col2 pour toutes les lignes dont col1 a une valeur qui change.
    J'espère que je suis clair.

  7. #7
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    si tu pouvais donner un exemple, ca serait super

    par exemple, si tu as cela dans ta table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    col 1  col 2
    1        1
    1        1
    1        2
    1        3
    2        4
    3        1
    4        4
    5        4
    ca doit te retourner quoi?

  8. #8
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 952
    Points
    1 952
    Par défaut
    ça devrait me retourner ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    col 1  col 2
    1        1
    2        4
    3        1
    4        4
    5        4
    En fait toutes les lignes ou la valeur de col1 diffère ( sans doublon ).

  9. #9
    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 comment choisir la valeur de col2 à retenir ?

    Si c'est la plus petite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT  col1, MIN(col2) 
    FROM matable
    GROUP BY col1

  10. #10
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 952
    Points
    1 952
    Par défaut
    Ok, ça fonctionne trés bien, MERCI !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    Salut!

    j'ai le même probleme...mais ma col2 n'est pas en chiffre mais en texte!
    Ce n'est pas important laquelle prend sql...disons la première qu'il trouve..

    quelqu'un pense que c'est possible de faire ça??


  12. #12
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Bobble Voir le message
    Ce n'est pas important laquelle prend sql...disons la première qu'il trouve..
    Avec MySQL, la requête ci-dessous, non normative, fonctionne et retournera effectivement la première valeur de col2 qu'il trouvera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT col1, col2
    FROM laTable
    GROUP BY col1
    Mais, sauf méconnaissance de ma part, rien ne dit a priori que col2 donnera toujours la même valeur si on exécute la requête plusieurs fois.
    C'est bien pour ça que cette requête n'est pas acceptée par la norme et est refusée par d'autres SGBD.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    merci beaucoup pour l'information!

    finalement j'ai trouvé comment faire...même si ce n'est pas vraiment joli...

    je fais une première requête pour prendre les valeurs de tab1, ensuite une seconde qui prend les valeurs de tab2 SANS ce trouvé en tab1.
    Ensuite je fais l'union. Et voilà.

    ça risque d'être très long si les tables sont grosses...mais je n'ai pas d'autres solutions pour le moment..

  14. #14
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ta solution ne me semble pas en rapport avec le problème posé à l'origine, ni avec ta question !

    Tu devrais poser concrètement ton probblème dans un nouveau message.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    oui, le problème est le même...c'est ma solution qui a changé...au départ je pensais faire une query sur les 2 tables et ensuite un distinct sur la clé primaire...mais comme vu, ce n'est pas possible. (c'est cela que je voulait savoir).
    J'ai alors "crée" mon distinct en enlevant en avance les clés en double...mais t'a raison, si j'aurais envie de trouver une autre solution je vais poster le problème ailleur.

    merci

  16. #16
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Citation Envoyé par Bobble Voir le message
    oui, le problème est le même...c'est ma solution qui a changé...au départ je pensais faire une query sur les 2 tables et ensuite un distinct sur la clé primaire...mais comme vu, ce n'est pas possible. (c'est cela que je voulait savoir).
    J'ai alors "crée" mon distinct en enlevant en avance les clés en double...mais t'a raison, si j'aurais envie de trouver une autre solution je vais poster le problème ailleur.

    merci
    S'il y a des "clefs primaires" en double, je ne donne pas cher de la base de données...

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

Discussions similaires

  1. super débutant sql
    Par romdyane dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/12/2005, 12h38
  2. Réponses: 5
    Dernier message: 10/10/2005, 08h49
  3. Réponses: 1
    Dernier message: 06/10/2005, 11h09
  4. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 16h55
  5. Débutant : SQL Server 2000
    Par bd0606 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/10/2003, 12h33

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