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

SQLite Discussion :

Modifier des lignes selon le nombre d'occurences d'une de leur cellules (join, count et distinct)


Sujet :

SQLite

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut Modifier des lignes selon le nombre d'occurences d'une de leur cellules (join, count et distinct)
    Salut à tous,

    J'ai une table avec un champ word non unique. Pour commencer, je veux une liste de toutes les lignes identiques avec le nombre de doublons. J'y parviens avec la commande suivante:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT word, count(word) FROM table GROUP BY word;

    Je souhaite ensuite isoler uniquement ceux dont le compte est de 1 (les valeurs de word uniques). Là ça coince. J'utilise ça, qui s'exécute mais renvoie presque toute la table (incluant des valeurs non uniques)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT word,
    (SELECT count(word) FROM DIC_FR GROUP BY word) as cnt
    FROM table 
    WHERE cnt=1;

    Une fois isolés, je souhaite faire un UPDATE sur ces données pour modifier un champ booléen is_unique à true

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Pour identifier les lignes uniques, la restriction se fait par une clause HAVING associée à GROUP BY.
    Pour sélectionner les lignes à mettre à jour, c'est à faire avec IN ou EXISTS en s'appuyant sur la requête précédente.
    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.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Ca a l'air de marcher pour la sélection avec ça:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT word,count(word) as cnt
    FROM table 
    GROUP BY word HAVING cnt=1;

    Je tente l'update

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    J'ai essayé ça mais je me suis raté:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE table SET is_unique = 1 WHERE EXISTS (
    SELECT word, is_unique, COUNT(word) as cnt
    FROM table
     GROUP BY word HAVING cnt=1);

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    En effet, il manque un lien entre la sélection et les lignes à mettre à jour.
    Les deux solutions :
    Avec IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE  table   tgt 
    SET     tgt.is_unique = 1 
    WHERE   tgt.word    IN 
            (   SELECT  src.word
                FROM    table   src
                GROUP BY src.word
                HAVING  COUNT(*) = 1
            )
    ;
    Avec EXISTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE  table   tgt 
    SET     tgt.is_unique = 1 
    WHERE   EXISTS 
            (   SELECT  NULL
                FROM    table   src
                WHERE   src.word = tgt.word
                GROUP BY src.word
                HAVING  COUNT(*) = 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.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    pas de soucis de lien j'imagine, puisque la requête est effectuée au sein de la même table. J'ai adapté ça pour ma table (en enlevant les références à src et tgt) mais ça me modifie toutes les lignes. J'ai même dupliqué ma table pour tester la requête avec une table tgt et une src mais j'obtiens toujours le même résultat Au cas où on se serait mal compris sur le problème voilà un exemple de ma table:

    word is_unique
    ombrelle 0
    parapluie 0
    chapeau 1
    parapluie 0
    ombrelle 0

    Je veux passer la colonne is_unique à 1 si une seule occurence de word existe dans la table.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/07/2014, 09h24
  2. [Toutes versions] Calculer le nombre d'occurence d'une valeur de cellule suivant condition
    Par shaun_the_sheep dans le forum Excel
    Réponses: 3
    Dernier message: 05/05/2010, 10h11
  3. Réponses: 15
    Dernier message: 09/06/2006, 12h13
  4. Réponses: 6
    Dernier message: 20/02/2006, 22h13
  5. [D7] comment ne pas modifier des lignes d'1 TStringGrid
    Par raoulmania dans le forum Composants VCL
    Réponses: 5
    Dernier message: 15/12/2005, 07h28

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