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

MySQL Discussion :

[10.0.20-MariaDB] Delete + requête indentée


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut [10.0.20-MariaDB] Delete + requête indentée
    Bonjour,

    Je rencontre un problème sur une de mes requêtes DELETE que je n'arrive pas à résoudre.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE FROM NM.NM_SWITCH A
    WHERE A.host LIKE 'SW003'
    AND A.interface LIKE 'Fa4/0/39'
    AND A.date NOT IN (SELECT MAX(date) from NM.NM_SWITCH B
                                WHERE B.host LIKE 'SW003'
                                AND B.interface LIKE 'Fa4/0/39')
    L'objectif est de supprimer toutes mes entrées hormis la MAX(DATE).

    Je rencontre une erreur, et malheureusement, je ne comprend pas pourquoi.

    Mariadb me retourne ce message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'A
    WHERE A.host LIKE 'SW003'
    AND A.interface LIKE 'Fa4/0/39'
    AND A.date NOT IN' at line 1
    Cette même requête en Select fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DELETE FROM NM.NM_SWITCH A
    WHERE A.host LIKE 'SW003'
    AND A.interface LIKE 'Fa4/0/39'
    AND A.date NOT IN (SELECT MAX(date) from NM.NM_SWITCH B
                                WHERE B.host LIKE 'SW003'
                                AND B.interface LIKE 'Fa4/0/39')
    [...]
    9 rows in set (0.00 sec)
    Voici la table :

    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
    MariaDB [NM]> describe NM_SWITCH;
    +---------------+--------------+------+-----+-----------+----------------+
    | Field         | Type         | Null | Key | Default   | Extra          |
    +---------------+--------------+------+-----+-----------+----------------+
    | id            | int(11)      | NO   | PRI | NULL      | auto_increment |
    | HOST          | varchar(25)  | NO   |     | NULL      |                |
    | IP            | varchar(15)  | NO   |     | NULL      |                |
    | PORT          | int(3)       | NO   |     | NULL      |                |
    | INTERFACE     | varchar(25)  | NO   |     | NULL      |                |
    | IFADMINSTATUS | varchar(5)   | NO   |     | NULL      |                |
    | IFOPERSTATUS  | varchar(5)   | NO   |     | NULL      |                |
    | IFSPEED       | varchar(5)   | NO   |     | NULL      |                |
    | IFINERROR     | int(11)      | NO   |     | NULL      |                |
    | IFINERRORT1   | int(11)      | NO   |     | 0         |                |
    | IFOUTERROR    | int(11)      | NO   |     | NULL      |                |
    | IFOUTERRORT1  | int(11)      | NO   |     | 0         |                |
    | MACADDR       | varchar(20)  | NO   | UNI | NULL      |                |
    | DATE          | datetime     | NO   |     | NULL      |                |
    | COMMENT       | varchar(140) | NO   |     | NOCOMMENT |                |
    +---------------+--------------+------+-----+-----------+----------------+
    Pour information :

    Cette requête fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE FROM NM.NM_SWITCH A
    WHERE A.host LIKE 'SW003'
    AND A.interface LIKE 'Fa4/0/39'
    AND A.date NOT IN (SELECT MAX(date) from NM.NM_SWITCH B)
    et celle-ci ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE FROM NM.NM_SWITCH A
    WHERE A.host LIKE 'SW003'
    AND A.interface LIKE 'Fa4/0/39'
    AND A.date NOT IN (SELECT MAX(date) from NM.NM_SWITCH B
                      	    WHERE 1)
    L'erreur provient dès lors que j'ajoute une condition dans ma requête indentée.

    Je suis à court d'idée et de recherches Google .

    C'est pourquoi je viens demander un coup de main.

    Merci.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 87
    Par défaut
    Hello,

    Etant donné que vous avez un alias dans le delete la syntaxe suivante devrait marcher, enfin j'immagine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE A FROM NM.NM_SWITCH A
    WHERE A.host LIKE 'SW003'
    AND A.interface LIKE 'Fa4/0/39'
    AND A.date NOT IN (SELECT MAX(date) from NM.NM_SWITCH B
                                WHERE B.host LIKE 'SW003'
                                AND B.interface LIKE 'Fa4/0/39')
    Par ailleurs je vous conseille vivement d'éviter l'utilisation de mot réservé comme nom de colonne (e.g. date).
    Je vous recommande, à défaut, de les délimiter entre backticks `date` afin d'éviter toute confusion pour vous et pour le SGBD.

    Par ailleurs, je ne connais pas MariaDb mais je suppose qu'à l'exécution de la requête ci-dessus il va vous balancer une erreur comme en MySQL

    Error Code: 1093. You can't specify target table 'NM_SWITCH' for update in FROM clause
    Etant donné qu'il n'est pas possible de modifier une table qui est également utilisée dans la condition de la modification (risque de mis à jour cyclique)

    Je vous conseille donc de décomposer la requête en deux, récupération de la date désirée puis supression.

    Sinon vous pouvez vous contenter de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE A FROM NM.NM_SWITCH A
    WHERE A.host LIKE 'SW003'
    AND A.interface LIKE 'Fa4/0/39'
    AND A.date NOT IN (SELECT * FROM (SELECT MAX(date) from NM.NM_SWITCH B
                                WHERE B.host LIKE 'SW003'
                                AND B.interface LIKE 'Fa4/0/39') as tmpset)
    Mais ça reste plutôt laid comme façon de faire.

    Cordialement,
    MvK

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut Merci
    Salut MvK0610,

    J'ai utilisé la deuxième solution qui fonctionne au poil.

    Je te remercie.

    Bonne journée.

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

Discussions similaires

  1. optimisation delete requete
    Par ekremyilmaz dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/04/2010, 10h52
  2. PB requete delete
    Par letudiant1 dans le forum ASP
    Réponses: 11
    Dernier message: 24/10/2005, 08h22
  3. Passage d'une requete en paramètre dans un delete
    Par jlamazou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/08/2005, 17h58
  4. [Firebird] DELETE sur le résultat d'une requete d'un IBQUERY
    Par shashark dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/06/2005, 18h17
  5. INTERBASE: DELETE avec sous requete conditionnelle
    Par Papino dans le forum InterBase
    Réponses: 6
    Dernier message: 17/02/2005, 22h55

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