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

Oracle Discussion :

Probleme select DISTINCT


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    SQLI
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut Probleme select DISTINCT
    Bonjour tout le monde,

    J’ai cette requête :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select DISTINCT champs1,champs2 
     from table 
    order by champs2 ;
    champs2 est le même sur toutes les lignes, mais le DISTINCT modifie le tri, je veux savoir sur la base de quelle logique ce changement de tri?

    PS : Dans mon exemple, et vu que j’ai pas de doublon, la requête sans/avec DISTINCT est censée renvoyer le même résultat mais c’est pas le cas.
    Avous-vous une idée le DISTINCT fait quoi à part l’élimination des doublons ? d’autres Order by peut être ? Où alors avez-vous une idée sur l'algorithme de "DISTINCT" ?

    Merci

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par waouni Voir le message
    Bonjour tout le monde,

    J’ai cette requête :


    select DISTINCT champs1,champs2 from table order by champs2 ;

    champs2 est le même sur toutes les lignes, mais le DISTINCT modifie le tri, je veux savoir sur la base de quelle logique ce changement de tri?
    Si "champs2" est le même sur toutes les lignes, le "order by champs2" ne sert à rien ; il vient demander du travail en plus sans garantir en rien l'ordre d'arrivée.
    Donc oui, avec un DISTINCT il y a des opérations en plus, ce qui peut changer l'ordre.

  3. #3
    Membre averti
    Homme Profil pro
    SQLI
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut
    Justement, mon abjectif c'est que de savoir la logique de DISTINCT qui fait bouger le tri.

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Mais ... il n'y a pas de tri possible entre des valeurs identiques !
    Donc la logique, c'est qu'il met les lignes dans l'ordre où elles lui arrivent. Et forcément, si on lui demande de faire des opérations en plus, elles peuvent ne pas arriver dans le même ordre.

    Si par contre vous lui demandez order by champs1, le DISTINCT garantissant l'unicité, il y aura un ordre unique, et ce sera alors déterministe.

  5. #5
    Membre averti
    Homme Profil pro
    SQLI
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut
    C'est clair.
    Ce que j'ai voulu savoir en fait, et je pense que c'est pas possible, c'est pourquoi si je rajoute "DISTINCT" dans la meme requete, ça me renvoie exactement le meme resultat mais avec un tri différent.

    Merci

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par waouni Voir le message
    Bonjour tout le monde,

    J’ai cette requête :


    select DISTINCT champs1,champs2 from table order by champs2 ;

    champs2 est le même sur toutes les lignes, mais le DISTINCT modifie le tri, ...
    C'est faux! Le tri se fait après le distinct donc peut importe ce que le distinct fait!
    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
     
    SQL> explain plan for
      2  
      2  Select distinct department_id, first_name
      3    from hr.employees
      4  order by first_name
      5  /
     
    Explained
     
    SQL> select * from table(dbms_xplan.display)
      2  /
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    Plan hash value: 1865327274
    --------------------------------------------------------------------------------
    | Id  | Operation           | Name      | Rows  | Bytes | Cost (%CPU)| Time
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT    |           |   107 |  1070 |     5  (40)| 00:00:01
    |   1 |  SORT ORDER BY      |           |   107 |  1070 |     5  (40)| 00:00:01
    |   2 |   HASH UNIQUE       |           |   107 |  1070 |     4  (25)| 00:00:01
    |   3 |    TABLE ACCESS FULL| EMPLOYEES |   107 |  1070 |     3   (0)| 00:00:01
    --------------------------------------------------------------------------------
     
    10 rows selected
    Essayez donc d’exemplifier vos propos avec un jeu d’essai.

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par mnitu Voir le message
    C'est faux! Le tri se fait après le distinct donc peut importe ce que le distinct fait!
    Attention, ici, le tri ne sert à rien, puisqu'il est opéré sur une colonne à valeur unique ; c'est pour ça que le distinct change l'ordre.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WITH t AS
         (  SELECT 3 AS a,'A' as b FROM DUAL
            UNION ALL       
            SELECT 1 AS a,'A' as b FROM DUAL
            UNION ALL
            SELECT 2 AS a,'A' as b FROM DUAL
           )       
    SELECT a,b FROM t ORDER BY b
    Me retourne l'ordre 3,2,1.
    Un distinct me sort 1,2,3.
    Si j'enlève le order by, j'ai l'ordre naturel de lecture 3,1,2.
    Enfin le distinct sans le order by me donne 3,2,1.

    Bien sûr, si je faisais un "vrai" tri, utile, sur la colonne a, j'aurais toujours le même ordre 1,2,3.

  8. #8
    Membre averti
    Homme Profil pro
    SQLI
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut
    Très bien! C'est clair

    Merci

  9. #9
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Attention, ici, le tri ne sert à rien, puisqu'il est opéré sur une colonne à valeur unique ; c'est pour ça que le distinct change l'ordre.

    ...
    Vous est en erreur, le tri c'est la derniére étape donc le distinct n'a rien à voir!
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> explain plan for
      2  
      2  WITH t AS
      3       (  SELECT 3 AS a,'A' AS b FROM DUAL
      4          UNION ALL
      5          SELECT 1 AS a,'A' AS b FROM DUAL
      6          UNION ALL
      7          SELECT 2 AS a,'A' AS b FROM DUAL
      8         )
      9  SELECT distinct a,b FROM t ORDER BY b
     10  /
     
    Explained
     
    SQL> select *
      2    from table(dbms_xplan.display)
      3  /
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    Plan hash value: 2975066302
    -------------------------------------------------------------------------
    | Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |      |     3 |    18 |     8  (25)| 00:00:01 |
    |   1 |  SORT ORDER BY   |      |     3 |    18 |     8  (25)| 00:00:01 |
    |   2 |   HASH UNIQUE    |      |     3 |    18 |     7  (15)| 00:00:01 |
    |   3 |    VIEW          |      |     3 |    18 |     6   (0)| 00:00:01 |
    |   4 |     UNION-ALL    |      |       |       |            |          |
    |   5 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
    |   6 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
    |   7 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
    -------------------------------------------------------------------------
     
    14 rows selected
    Citation Envoyé par Rei Ichido Voir le message
    ...
    Me retourne l'ordre 3,2,1.
    Un distinct me sort 1,2,3.
    Si j'enlève le order by, j'ai l'ordre naturel de lecture 3,1,2.
    Enfin le distinct sans le order by me donne 3,2,1.

    Bien sûr, si je faisais un "vrai" tri, utile, sur la colonne a, j'aurais toujours le même ordre 1,2,3.
    Il n'y pas "d'ordre naturel"! Il y a simplement de gens qui n'ont pas encore compris que sans "order by" les enregistrement arrivent dans un ordre non défini.

  10. #10
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Vous est en erreur, le tri c'est la derniére étape donc le distinct n'a rien à voir!
    Donc vous affirmez que vous n'obtenez pas les même résultats que moi ? Le test est simple à faire.
    Je ne conteste pas que le tri arrive en dernier. Je dis juste - si vous me relisez - que si le tri ne peut pas distinguer les objets, l'ordre n'est plus garanti et donc dépend forcément de ce qui s'est passé avant.

    Il n'y pas "d'ordre naturel"! Il y a simplement de gens qui n'ont pas encore compris que sans "order by" les enregistrement arrivent dans un ordre non défini.
    Quand je fais "SELECT 1 FROM DUAL UNION ALL SELECT 2 FROM DUAL", certes la norme SQL me dit que les résultats peuvent arriver dans n'importe quel ordre, en pratique sur Oracle j'ai toujours eu 1,2. Alors certes, je ne me baserai jamais là dessus (si l'ordre est important, je mettrai un order by), mais on sent bien que le SGBD traite les choses "dans l'ordre".

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Quand je fais "SELECT 1 FROM DUAL UNION ALL SELECT 2 FROM DUAL", certes la norme SQL me dit que les résultats peuvent arriver dans n'importe quel ordre, en pratique sur Oracle j'ai toujours eu 1,2. Alors certes, je ne me baserai jamais là dessus (si l'ordre est important, je mettrai un order by), mais on sent bien que le SGBD traite les choses "dans l'ordre".
    Avec des si on met paris en bouteille...

    Pourquoi se baser sur des choses qu'on sait fausses alors que c'est tellement plus simple et vrai d'ajouter un order by?
    D'autant plus que ca ne fonctionne (peut-etre) que pour votre select from dual. A partir du moment ou vous avez une table avec des delete et insert, c'est dans le desordre. C'est juste a proscrire comme solution

    Enfin chacun est libre de faire ce qu'il veut

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    ...Je dis juste - si vous me relisez - que si le tri ne peut pas distinguer les objets, l'ordre n'est plus garanti et donc dépend forcément de ce qui s'est passé avant.
    ...
    Il n'y a pas de tri sans order by! Et en présence d'"order by" le distinct ne change pas l'ordre. Parler de tri sans order by est un non sens.

    Avant Oracle 10 le group by faisait aussi le tri. Quand Oracle a changé l'algorithme de regroupement toutes les requêtes sans order by ont deconnées!

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

Discussions similaires

  1. Probleme sur un SELECT DISTINCT
    Par pierre50 dans le forum Débuter
    Réponses: 3
    Dernier message: 13/03/2012, 23h17
  2. [AJAX] requete liée avec select distinct
    Par anthonydb1 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/12/2008, 15h12
  3. Probleme avec select distinct row from .
    Par jean christophe dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/10/2008, 19h17
  4. Probleme avec la clause SELECT DISTINCT
    Par jojodid dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 06/05/2008, 14h12
  5. Probleme (simple) sur un select distinct
    Par phaby dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/04/2006, 13h38

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