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 :

Erreur avec DELETE !


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut Erreur avec DELETE !
    Bonjour,
    A l'execution de ceci a l'interieur d'un composant Query de Delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT * FROM TABLE1 T1
    WHERE EXISTS (SELECT *
                  FROM TABLE1 T2
                  WHERE T1.Ninc <> T2.Ninc
                  AND T1.NoTicket = T2.NoTicket
                  AND T1.DatPai = T2.DatPai)
     
    DELETE * FROM TABLE1 T
    WHERE  T.Ninc < ANY (SELECT Ninc
                          FROM   TABLE1 T2
                          WHERE  T.Ninc <> T2.Ninc
                          AND  T.NoTicket    = T2.NoTicket
                          AND  T.DatPai = T2.DatPai)
    g une erreur qui me dit "Utilisation incorrecte du mot clé DELETE" !!!!???

    Pouvez vous m'aider
    Merci

  2. #2
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    bonjour,

    DELETE FROM table, pas de '*'
    et normalement pas d'alias non plus, mais ça pratiquement ts les moteurs l'acceptent, donc tu as 1 chance.

    A +

  3. #3
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    Ca n'a rien changé...... ?

  4. #4
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    C'est quelle composante que t'as utilisé?

  5. #5
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Re,

    C quoi ton moteur, la version et le msg d'erreur ?

  6. #6
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Si je comprends bien, tu essaies d'exécuter 2 requêtes à la suite dans ton Query. Le Query est fait pour exécuter une seule requête à la fois.
    Si tu y tiens, il faudrait utiliser un composant d'éxécution de script, et terminer la première (généralement par un ";"). Mais à mon aivs le plus simple est généralement d'exécuter une requête puis l'autre.
    Roland

  7. #7
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chemin:=StatusBar1.Panels[0].Text+'\'+Label1.Caption+'\'+'Test.db';
    query1.SQL.Text:='SELECT DISTINCT * FROM '+'"'+chemin+'"'+' T1 WHERE EXISTS (SELECT * FROM '+'"'+chemin+'"'+' T2 WHERE T1.Ninc <> T2.Ninc AND T1.Noticket = T2.Noticket AND T1.Date = T2.Date)';
        query2.SQL.Text:='DELETE FROM '+'"'+chemin+'"'+' T WHERE  T.Ninc < ANY (SELECT Ninc FROM '+'"'+chemin+'"'+' T2 WHERE  T.Ninc <> T2.Ninc AND T1.Noticket = T2.Noticket AND T1.Date = T2.Date)';
        query1.Open;
        query2.Open;
    a l'execution pas à pas de delphi, g une erreur sur 'Query1.open' où on me dit : "Utilisation incorrecte du mot clé. ELEMENT : Date"

    Pouvez vous m'aider ?

    Merci bcp !!!

  8. #8
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Une remarque : Présenté comme ça, c'est très difficiliement lisible. J'écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Query1 .SQL .Text
       := 'SELECT DISTINCT *'#10
        + Format ('FROM %s T1'#10, [Chemin])
        + Format ....
    NB : Les #10 sont des retours à la ligne qui me permettent, lorsque j'ai un pb sur une SQL, d'afficher ma SQL de manière lisible avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage (SQL .Text)
    A part ça , ton erreur doit venir de ce qu'un champ de ta table s'appelle "Date", qui est un mot réservé du SQL. Deux solutions : si c'est possible, change le nom de ton champ, sinon, écris
    Roland

  9. #9
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    je pense que date est un mot clé utilisé dans ton sgbd. or date est aussi un champ de ta table non?
    donc il doit faire une confusion entre ces 2 dates.

    change le nom de ta colonne

    PS: dsl javais pas vu rsc ma devancé...

  10. #10
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    Merci !

    L'erreur a disparu pour laisser la place à une autre .....
    Elle se manifeste lors de Query2.open donc fait référence à la requete SQL de query2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE FROM "chemin" T 
    WHERE  T.Ninc < ANY (SELECT Ninc 
                          FROM   "chemin" T2 
                          WHERE  T.Ninc <> T2.Ninc 
                          AND  T.NoTicket    = T2.NoTicket 
                          AND  T.DatP = T2.DatP)
    L'erreur dit : "Erreur à la création du handle de curseur"

    Comprend vraiment pas...

  11. #11
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Je ne saisis pas toutes les finesses de ta requête, amis si tu veux utiliser l'alias "T" dans la clause SELECT, il faut le définir à l'intérieur de cette clause, puisque ta requête va d'abord exécuter le SELECT, et ensuite seulement de DELETE.
    Roland

  12. #12
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    Je n'ai fait que reprendre un code trouvé sur un site pour supprimer des doublons dans une table ...

  13. #13
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Je ne suis pas sûr que ça marche, mais je ne suis pas expert SQL et c'est lundi .Toujours est-il que j'écrirais le SELECT comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T2.Ninc
                          FROM   "chemin" T2, "chemin" T1 
                          WHERE  T1.Ninc <> T2.Ninc
                          AND  T1.NoTicket    = T2.NoTicket
                          AND  T1.DatP = T2.DatP)
    Ce qui devrait te donner les doublons, mais j'ai l'impression que ça va te les donner en double
    Pour le reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM "chemin" T
    WHERE  T.Ninc < ANY (SELECT...
    va à mon avis t'effacer tous les enregistrements où Ninc est inférieur à un au moins des doublons renvoyés : : Alors sauvegarde ta table avant de faire l'expérience !
    Roland

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    1) l'utilisation de " " n'est requis que si le nom d'objet est un mot clef de SQL et il vaut mieux eviter cela.

    2) une table cible d'une mise à jour ne doit JAMAIS être alliassée :

    La norme SQL interdit de donner un alias à une table cible d'une mise à jour (INSERT, UPDATE, DELETE).
    Pour une bonne et simple raison : il ne peut absolument pas y avoir d'ambiguité car il ne peut jamais y avoir qu'une seule table cible dans les ordres SQL INSERT, UPDATE et DELETE, et que la table est toujours explicitement décrite :

    UPDATE <LaTableCible>
    ...

    DELETE FROM <LaTableCible>
    ...

    INSERT INTO <LaTableCible>
    ...

    En conclusion, la référence à une colonne de la table cible ne permet pas l'utilisation d'alias !

    Ta requête doit donc s'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE FROM chemin
    WHERE  Ninc < ANY (SELECT Ninc
                       FROM   chemin T2
                       WHERE  Ninc <> T2.Ninc
                         AND  NoTicket = T2.NoTicket
                         AND  DatP = T2.DatP)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  15. #15
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chemin:=.....+'Test2.db';
        query1.SQL.Text:=
        query2.SQL.Text:=    query1.Open;
        query2.Open;

  16. #16
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    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
    chemin:=...+'Test2.db';
    query1.SQL.Text:=
     
    SELECT DISTINCT * FROM "chemin" T1 
    WHERE EXISTS (SELECT * 
                  FROM "chemin" T2 
                  WHERE T1.Ninc <> T2.Ninc 
                  AND T1.NoTicket = T2.NoTicket 
                  AND T1.DatPai = T2.DatPai) 
     
     
    query2.SQL.Text:=
     
    DELETE FROM "chemin"
    WHERE Ninc < ANY (SELECT Ninc 
                          FROM   "chemin" T2 
                          WHERE Ninc <> T2.Ninc 
                          AND NoTicket    = T2.NoTicket 
                          AND DatPai = T2.DatPai)
     
    query1.Open;
    query2.Open;
    Le première requête fonctionne et arrivé à "Query2.open", l'erreur apparait : "Erreur à la création du handle de curseur"

    Comprend plus...

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Essaye : au lieu de pour les requêtes SQL qui n'effectuent pas des SELECT
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  18. #18
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    Enfin MERCI !!!!!

    C ok comme ca. Ca tenait à pas grand chose.....

    Merci encore

    A+

  19. #19
    Membre du Club Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Points : 49
    Points
    49
    Par défaut
    Par contre, SQL PRO, Ta solution n'a plus l'air de fonctionner dans ce cas. En effet, j'ai rajouté l'alias et ca fonctionne. Sans, la suppression des enregistrements ne fonctionnait pas. Aprés, je ne sais pas pourquoi?

    Merci

    donc mettre en 2ième requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    query2.SQL.Text:= 
     
    DELETE FROM "chemin" T
    WHERE T.Ninc < ANY (SELECT Ninc 
                          FROM   "chemin" T2 
                          WHERE T.Ninc <> T2.Ninc 
                          AND T.NoTicket    = T2.NoTicket 
                          AND T.DatPai = T2.DatPai) 
     
    Query2.ExecSQL;
     
     
    Voila !

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

Discussions similaires

  1. Erreur sur DELETE avec condition sur un DATETIME
    Par Luke58 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/08/2009, 12h00
  2. Erreur de segmentation avec delete
    Par ValyGator dans le forum C++
    Réponses: 13
    Dernier message: 11/02/2009, 20h44
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

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