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 :

Aide sur la création d'une requête SQL


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Informaticien en Centre d'appel
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Informaticien en Centre d'appel
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Aide sur la création d'une requête SQL
    Bonjour a tous,

    Je suis un débutant sur SQL et j'aurai besoin de votre aide pour la création d'une requête qui pour moi me parait hyper difficile. J’espère de tout cœur que quelqu'un pourra m'aider dessus. JE dis merci d'avance pour celui qui m'apportera son aide et son temps.

    J'explique ce dont j'ai besoin:
    J'ai une table "CLIENT" qui contient les champs suivants:
    CODE, NOM, TEL, LISTE, STATUS
    Exemple 1:

    CODE NOM TEL LISTE STATUS
    0001 rasbenny 0123456789 5001 OK RDV
    0002 bob 0187654321 5999 NEW
    0003 stacy 0452639871 5013 PAS INTERESSE
    0004 bob 0187654321 5024 DROP


    Je dois créer une requête de mis a jour pour changer les status a "XX" sur toutes les fiches ou les conditions suivantes sont réunis:

    - Dans le champ LISTE ou elle n'est pas égale a 5999.
    - Dans le champ TEL ou les numéros de téléphone sont identique.

    Exemple 2:

    Les fiches CODE = 0002 et 0004, NOM = bob, TEL = Le numéro de téléphone sont identiques, LISTE = 5999 et 5024, STATUS = NEW et DROP.
    Il faut que le STATUS de la fiches CODE = 0004 dont la LISTE = 5024 soit mis a jour a "XX". Et que la fiche CODE = 5999 reste tel quel sans modification.

    J’espère avoir été assez précis mais si tel n'a pas été le cas, je reste disponible a toutes vos questions.

    Encore une fois MERCI pour votre temps et votre aide

    Très Cordialement
    Rasbenny.

  2. #2
    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 480
    Points
    28 480
    Par défaut
    Bonjour,

    Où rencontres-tu une difficulté dans la requête ?
    Qu'as-tu déjà essayé ?

    Reprenons les informations dans l'ordre.
    Tu veux modifier les lignes
    • dont la colonne LISTE n'a pas la valeur 5999,
    • pour lesquelles il existe au moins une autre ligne comportant la même valeur dans la colonne TEL.

    A partir de là, il ne reste plus qu'à remplacer les mots de la phrase par leur équivalent dans le langage SQL.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Informaticien en Centre d'appel
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Informaticien en Centre d'appel
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Correction de requêtes
    Salut à tous, j'espère que vous allez bien.

    J'ai un gros problème pour supprimer certaines fiches a partir de mon CRM vicidial. Je dois supprimer environ 2000 fiches qui se trouve dans des listes différentes.
    Sur vicidial, j'ai des listes différentes, parce que je crée les listes en fonction de la région sur laquelle je dois travailler. Exemple : 50001 contient toutes les fiches dont le code postale commence par 01, 50002 pour les codes postaux commençant par 02, 50003 etc, etc...

    Au total j'ai 46 differentes listes mais toutes les listes contiennent moins de 50 000 fiches.
    J'espère que tout est clair jusqu'à present.

    J'ai reçu une demande de suppression d'environ 2000 fiches sur différentes listes. Pour commencer la tâche, j'ai créé une nouvelle liste, 59999, qui contient tous les numéros que je vais devoir supprimer. Désormais, chaque fois que j'ai de nouvelles listes à charger, vicidial peut automatiquement supprimer toutes celles ayant des numéros qui existent déjà dans cette nouvelle liste. Mais là où je suis bloqué, c'est en fait que je dois supprimer aussi tous ceux qui existent déjà.
    J'ai essayé de les supprimer en utilisant une requête SQL mais ma requête n'est pas bonne et j'ai à chaque fois un message d'erreur qui est le suivant :

    Erreur SQL (1064) : vous avez une erreur dans votre syntaxe SQL ; consultez le manuel qui correspond à la version de votre serveur MariaDB pour la bonne syntaxe à utiliser près de '[vicidial_list'].['status'] = 'XX - A NE PAS APPELER' WHERE (((['vicidial_list' à la ligne 1
    La requête SQL que j'utilise est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE `vicidial_list` SET [`vicidial_list`].[`status`] = "XX - A NE PAS APPELER" WHERE ((([`vicidial_list`].[phone_number]) In (SELECT `phone_number` FROM `vicidial_list` As Tmp GROUP BY `phone_number`
    HAVING Count(*)>1 )) AND (([`vicidial_list`].[list_id]) Not Like "5999"));
    Quelqu'un peut-il m'aider à corriger la requête s'il vous plaît ?

    Je dois admettre que je ne suis pas un génie ni sur SQL ni sur vicidial, mais j'ai une connaissance des bases.

    Je vous remercie d'avance pour l'aide et le temps que vous me consacrerez.

    Cordialement
    Rasbenny.
    Skype: rasbenny

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 284
    Points : 12 986
    Points
    12 986
    Par défaut
    Bonjour,
    Tu as mis des doubles quotes comme délimiteur de chaine, alors qu'il faut utiliser des simples quotes.

    Tatayo.

  5. #5
    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 480
    Points
    28 480
    Par défaut
    Bonjour,

    Peut-être qu'en encadrant les chaines de caractères avec des apostrophes au lieu de guillemets cela fonctionnera mieux.

    Par ailleurs, en indentant les commandes et en supprimant les parenthèses, crochets et autres apostrophes inversées inutiles la requête sera plus facile à lire.

    Enfin, l'opérateur LIKE doit être associé à un modèle comportant des caractères génériques (% et _). Pour une simple comparaison de chaines, c'est l'opérateur = qui doit être utilisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE  vicidial_list 
    SET     vicidial_list.status = 'XX - A NE PAS APPELER' 
    WHERE   vicidial_list.phone_number 
            IN  (   SELECT  phone_number 
                    FROM    vicidial_list As Tmp 
                    GROUP BY phone_number
                    HAVING  COUNT(*) > 1 
                )
        AND vicidial_list.list_id <> '5999'
    ;

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Informaticien en Centre d'appel
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Informaticien en Centre d'appel
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Aide sur la création d'une requête SQL
    Re bonjour,

    Merci pour vos réponses.

    J'ai corriger et lancer, par contre cette fois j'ai le message d'erreur suivant:

    Erreur SQL (1093) : la table 'vicidial_list' est spécifiée deux fois, à la fois comme cible pour 'UPDATE' et comme source distincte pour les données.
    Ma requête ressemble à cela maintenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE vicidial_list
    SET vicidial_list.status = 'XX - A NE PAS APPELER' 
    WHERE vicidial_list.phone_number
    		IN ( SELECT phone_number 
    		FROM vicidial_list As Tmp 
    		GROUP BY phone_number 
    		HAVING COUNT(*) > 1  
    			)
    		AND vicidial_list.list_id <> '5999' ;
    Merci encore pour vos aides. Juste une autre petite questions, la requête est bien pour supprimer les fiches des autres listes ou les numéros de téléphone sont identiques à celles se trouvant dans la liste 59999?

    Très Cordialement
    Rasbenny

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 377
    Points : 39 852
    Points
    39 852
    Billets dans le blog
    9
    Par défaut
    De ce que je comprends, en cas de doublon sur le n° de téléphone, la ligne ayant pour la colonne list_id la valeur '5999' est inchangée et les lignes dont la colonne list_id a une valeur différente de '5999' sont mises à jour.
    Si c'est bien ça, plutôt que d'utiliser un regroupement, utilisez un test d'existence, ce sera plus performant.
    Et aussi, utilisez des alias de table(VL et V2 ci-dessous), c'est plus pratique que des noms in extenso :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE vicidial_list VL
    SET   VL.status = 'XX - A NE PAS APPELER'
    WHERE VL.list_id<>'5999'
      AND EXISTS
        (select 1
         from vicidial_list V2
         where V2.phone_number =VL.phone_number 
           and V2.list_id='5999'
        )

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Informaticien en Centre d'appel
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Informaticien en Centre d'appel
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Aide sur la création d'une requête SQL
    Re,


    Citation Envoyé par escartefigue
    De ce que je comprends, en cas de doublon sur le n° de téléphone, la ligne ayant pour la colonne list_id la valeur '5999' est inchangée et les lignes dont la colonne list_id a une valeur différente de '5999' sont mises à jour.
    Si c'est bien ça, plutôt que d'utiliser un regroupement, utilisez un test d'existence, ce sera plus performant.
    Et aussi, utilisez des alias de table(VL et V2 ci-dessous), c'est plus pratique que des noms in extenso :

    Oui effectivement c'est bien cela.

    J'ai corriger la requête comme indiquer dans votre exemple, mais malheureusement j'ai le même message d'erreur c'est a dire:

    Erreur SQL (1093) : la table 'VL' est spécifiée deux fois, à la fois comme cible pour 'UPDATE' et comme source distincte pour les données.

    Ma requête est désormais somme suite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE vicidial_list VL
    SET VL.status = 'XX - A NE PAS APPELER' 
    WHERE VL.list_id<>'5999'
    			AND EXISTS
    			(select 1
    			 from vicidial_list V2
    			 where V2.phone_number =VL.phone_number
    			   and V2.list_id = '5999'
    			) ;
    Donc, comme vous pouvez le constater les deux manières de faire me renvoie la même erreur. Avez vous une idée de comment corriger cela svp?

    Tres Cordialement
    Rasbenny

  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 480
    Points
    28 480
    Par défaut
    Quel SGBD utilises-tu ? Quelle est sa version ?

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Informaticien en Centre d'appel
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Informaticien en Centre d'appel
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Aide sur la création d'une requête SQL
    Re,

    J'utilise HeidiSQL

    Version 11.2.0.6213 (64bit)

    Environnement: Windows v6.1

    J'effectue tous les requêtes SQL pour mes différentes taches dessus. C'est a dire: pour aller chercher les données, les mettre a jour, les supprimes etc sur mon serveur asterisk.

    Tres Cordialement

    Rasbenny

  11. #11
    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 480
    Points
    28 480
    Par défaut
    HeidiSQL n'est pas un SGBD, c'est juste un outil d'administration et consultation d'une base de données, le plus souvent MySQL.

    Avec une version ancienne de MySQL, tu peux essayer de masquer la dépendance entre la table mise à jour et celle consultée en plaçant celle-ci dans une table dérivée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE  vicidial_list   lst
    SET     lst.status  = 'XX - A NE PAS APPELER' 
    WHERE   lst.list_id <> '5999'
        AND EXISTS
            (   SELECT  1
                FROM    (   SELECT  phone_number 
                            FROM    vicidial_list
                            WHERE   list_id = '5999'
                        )   exc
                WHERE   exc.phone_number    = lst.phone_number
            )  
    ;
    Une version récente de MySQL devrait t'autoriser à effectuer cette mise à jour directement.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Informaticien en Centre d'appel
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Informaticien en Centre d'appel
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Aide sur la création d'une requête SQL
    Re,

    Cette fois elle a fonctionner.

    En ce qu'il s'agit d'une version recente de MYSQL, j'aurai besoin d'aide pour la mette en place.

    Si toutefois il vous est possible de m'aider a le mettre en place, faites le moi savoir s'il vous plait.

    Dites moi ce que je dois faire et je le ferai.

    Encore une fois merci pour votre aide.

    Pour finir, maintenant si je veux visualiser les mises a jour qui ont ete effectues, je modifie comment la requete pour qu'elle devienne une requete SELECT, svp?

    Tres Cordialement

    Rasbenny

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 377
    Points : 39 852
    Points
    39 852
    Billets dans le blog
    9
    Par défaut
    Et avec cette syntaxe-ci ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE VL
    SET   status = 'XX - A NE PAS APPELER'
    from vicidial_list VL
    WHERE list_id<>'5999'
      AND EXISTS
        (select 1
         from vicidial_list V2
         where V2.phone_number =VL.phone_number 
           and V2.list_id='5999'
        )
    ;

    EDIT : ah non pardon, votre SGBD est MySQL je viens de le voir, la syntaxe ci-dessus est pour SQL server

    En tout cas un test d'existence avec EXISTS reste préférable à la solution se basant sur IN + GROUP BY.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Informaticien en Centre d'appel
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Informaticien en Centre d'appel
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Aide sur la création d'une requête SQL
    Re,

    Citation Envoyé par escartefigue
    En tout cas un test d'existence avec EXISTS reste préférable à la solution se basant sur IN + GROUP BY.
    Pour être sincère, c'est du chinois a ce stade. Mais ce soir a la maison, j'aurai le temps d'aller chercher dans les cours en lignes les explications et je vais tout mettre etape par etape de tous ce que vous avez mentionnes pour essayer de mieux comprendre.

    C'est la premiere fois que j'utilise EXIST dans une requete, d'ou la raison de ma question, si maintenant je veux visualiser les mises a jourr qui ont ete effectues, quels sont par exemples les fiches dont le champ status a changer et est desormais XX - A NE PAS APPELER et quel liste_id elle appartient. Comment est ce que je dois modifier cette requete:

    Est ce que la requete ci-desosus est correcte svp?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT * FROM vicidial_list   lst
    WHERE   lst.list_id <> '5999'
        AND EXISTS
            (   SELECT  1
                FROM    (   SELECT  phone_number 
                            FROM    vicidial_list
                            WHERE   list_id = '5999'
                        )   exc
                WHERE   exc.phone_number    = lst.phone_number
            )  
    ;
    Merci encore pour votre precieuse aide.

    Tres Cordialement
    Rasbenny.

  15. #15
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 377
    Points : 39 852
    Points
    39 852
    Billets dans le blog
    9
    Par défaut
    S'il n'y a pas eu d'autres origines pour la valeur 'XX - A NE PAS APPELER' dans la colonne status, alors la détection est plus simple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select *
    from vicidial_list   
    where  status = 'XX - A NE PAS APPELER'

    Concernant la différence entre les deux solutions.

    La première avec IN et GROUP BY constitue la liste de toutes les lignes de la table, trie le résultat par n° de téléphone pour pouvoir faire le GROUP BY, puis ne retient que les lignes ayant plusieurs fois le même n°
    La deuxième avec EXISTS recherche la présence d'une ligne ayant le même numéro, sans consulter les autres lignes. Donc beaucoup moins de lignes parcourues et pas de tri ni de comptage à faire.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Informaticien en Centre d'appel
    Inscrit en
    Avril 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Informaticien en Centre d'appel
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2021
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Aide sur la création d'une requête SQL
    Re,

    Ah d'accord j'ai compris maintenant.

    Encore merci pour tous et bon courage.

    Tres cordialement

    Rasbenny

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/11/2018, 09h12
  2. Aide sur la creation d une classe ;
    Par valdano dans le forum C++
    Réponses: 3
    Dernier message: 05/07/2017, 21h21
  3. Probleme a la creation d'une requete SQL
    Par mica85 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/07/2008, 19h24
  4. Creation d'une requete SQL
    Par CrazySeb dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/07/2007, 18h06
  5. [SQL] Besoin d'aide sur les attributs pour une requete
    Par bobobobo01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/11/2006, 22h39

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