8
votes

Vous ne pouvez pas spécifier la table cible 'Nom' pour la mise à jour de la clause

im essayant d'appliquer Cette solution à mes données dans le tableau dans MySQL DB qui a duplicate. Et je reçois une telle erreur:

SQL Error [1093] [HY000]: You can't specify target table 'NAME' for update in FROM clause


DELETE NAME FROM NAME
WHERE NAME.id NOT IN
   (SELECT MIN(id) 
   FROM NAME GROUP BY col1, col2)


3 commentaires

Votre requête ne ressemble à celle de la solution que vous essayez d'appliquer. Ils utilisent une jointure, alors que vous utilisez pas dans .


@ggyal mon lien pointe sur le commentaire, pas à la réponse


Ah, assez juste; Je n'avais pas remarqué ça. Ce commentaire est SQL Server spécifique. Vous trouverez que la jointe donnée dans la réponse fonctionnera dans MySQL.


5 Réponses :


28
votes

Essayez ceci peut vous aider

DELETE  FROM NAME
WHERE NAME.id NOT IN (
                     SELECT * FROM ( 
                                    SELECT MIN(id)  FROM NAME GROUP BY col1,col2
                                   ) AS p 
                      ) 


3 commentaires

Mais en fait, je ne comprends pas - si Docs dit que vous ne pouvez pas faire sous-requêtes à Supprimer (voir AIB Réponse) - Pourquoi votre solution fonctionne-t-elle?


sa discussion sur ici < / a>


Cela a fonctionné mais pourquoi nous ne pouvons pas spécifier ce que nous mettons à jour. J'ai commencé à apprendre SQL de [ici] (sql.learncodethhardward.org/book/ex8.html). Ici, ils l'utilisaient dans l'exercice8 et exercice10. Vérifiez s'il vous plaît.



0
votes

Si vous souhaitez supprimer des enregistrements d'une table Utilisez Supprimer de Tablename . Vous ne pouvez pas spécifier une colonne ici. Si vous souhaitez supprimer les données d'une colonne, veuillez utiliser l'instruction de mise à jour pour définir la valeur de la colonne sur vide ou null.


0 commentaires

3
votes

du manuel :
"Actuellement, vous ne pouvez pas supprimer d'une table et sélectionner dans la même table dans une sous-requête."

Utilisez un moteur de base de données approprié ou exécutez les requêtes séparément. (Stockage de l'identifiant de manière programmatique, entre les deux.)


2 commentaires

Pouvez-vous donner l'exemple?


D'une bonne base de données? PostgreSQL.



-1
votes

La syntaxe de Supprimer

ne pas nécessiter le nom des colonnes car mysql Supprimer toutes les données qui répondent à une condition


0 commentaires

4
votes

Votre requête est correcte et fonctionnerait sur d'autres SGBD, mais MySQL ne vous permet pas de mettre à jour ou de supprimer d'une table et de sélectionner dans la même table dans une sous-requête. Il est documenté sur l'officiel Supprimer DOCS.

IT pourrait être corrigé sur les versions futures, mais votre requête n'est actuellement pas prise en charge. P>

Un correctif simple serait de mettre votre sous-requête dans une sous-sous-requier, comme dans ECHO_ME Réponse: P>

DELETE N1
FROM
  NAME N1 INNER JOIN NAME N2
  ON
    N1.col1=N2.COL1
    AND N1.col2=N2.col2
    AND N1.ID > N2.ID


0 commentaires