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 :

comment faire une requete qui retourne les données repetées ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut comment faire une requete qui retourne les données repetées ?
    Bonjours

    comment faire une requete qui retourne les valeurs répetées d'un champs dans une table
    (exp: le champs 'mat contient {11,12,14,11,13,14} ma requete doit retourner
    11 et 14)
    merci

  2. #2
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut


    une requête select avec un Group By et un Having.


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Mat
    FROM MaTable
    GROUP BY mat HAVING (count(mat)>1);

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 100
    Points : 113
    Points
    113
    Par défaut
    La requête SQL suivante fonctionne également

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Mat
    FROM MaTable
    GROUP BY mat HAVING (count(*)>1);

  4. #4
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par sillycoder
    La requête SQL suivante fonctionne également

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Mat
    FROM MaTable
    GROUP BY mat HAVING (count(*)>1);

    Moi je mettrais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Mat
    FROM MaTable
    GROUP BY mat HAVING (count(1  )>=2);
    count(1) => ca lit pas les champs donc c'est plus rapide...

    >=2 ... si je me souviens bien le having prefere ca ....

  5. #5
    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 miloux32
    count(1) => ca lit pas les champs donc c'est plus rapide...

    >=2 ... si je me souviens bien le having prefere ca ....


    avec quel sgbd ?

  6. #6
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par Mathusalem
    avec quel sgbd ?
    le premier avec tous ....

    count(*) ca equivaut a faire "count(unchamp)" donc il a besoin de parcourir le bloc pour avoir la valeur du champ ....

    count(1) => ben il lit 1 donc pas de lecture de champs .....


    pour le having , je crois me souvenir que la clause "=" (ou >=) permet d'utiliser les index etc ...

    je sais que c'est bon en oracle et en principe ca doit etre bon pour les autres ..( en plus ca coute rien de faire ca )

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 401
    Points
    28 401
    Par défaut
    Je suis fort sceptique

    En théorie :
    COUNT(*) compte le nombre de lignes, sans s'inquiéter de leur contenu
    COUNT(colonne) compte le nombre de lignes où colonne n'est pas NULL
    COUNT(DISTINCT colonne) compte le nombre de valeurs distinctes de colonne, en excluant les NULL


    Donc COUNT(1) ne devrait pas être très différent de COUNT(*), sinon en rajoutant un test pour la non nullité de la valeur 1

  8. #8
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par al1_24
    Je suis fort sceptique

    En théorie :
    COUNT(*) compte le nombre de lignes, sans s'inquiéter de leur contenu
    COUNT(colonne) compte le nombre de lignes où colonne n'est pas NULL
    COUNT(DISTINCT colonne) compte le nombre de valeurs distinctes de colonne, en excluant les NULL


    Donc COUNT(1) ne devrait pas être très différent de COUNT(*), sinon en rajoutant un test pour la non nullité de la valeur 1
    Ben je tiens ca d'un expert DBA oracle qui m'a fait une formation de tuning oracle ..... j'en discuterais à l'occasion

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 401
    Points
    28 401
    Par défaut
    Je ne travaille pas sur Oracle. Je ne connais donc pas bien les spécificités de ce SGBD.
    Je viens de m'amuser ici à faire quelques tests sur une petite table de 250 millions de lignes, sans index unique *, avec entre autres une colonne Commentaire VARCHAR(2500)...
    Temps d'exécution identique sur les quatre requêtes : 45 secondes, à 1 ou deux secondes près :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*) FROM table;
    SELECT COUNT(1) FROM table;
    SELECT SUM(1) FROM table;
    SELECT COUNT(commentaire) FROM table;
    * Avec un index unique, la table n'est pas balayée mais seulement l'index, donc une poignée de secondes d'exécution !

  10. #10
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Count(*) lit bien le bloc entier

  11. #11
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par Yanika_bzh
    Count(*) lit bien le bloc entier
    C'est quoi un bloc ?

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/04/2015, 07h54
  2. Réponses: 2
    Dernier message: 08/01/2009, 11h49
  3. Réponses: 10
    Dernier message: 13/08/2007, 16h12
  4. faire une requete qui ne sort que les valeurs d'un champ coché
    Par joseph.breham dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/12/2006, 16h01
  5. Réponses: 2
    Dernier message: 16/10/2006, 09h22

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