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 ....
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  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 )
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    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
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  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
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    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 !
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  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
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  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