2009-12-25 4 views
2

Quelqu'un peut-il me aider à comprendre ce qui ne va pas avec cette requête:MySQL, DELETE requête avec une jointure

DELETE FROM noteproject 
INNER JOIN note ON noteproject.noteID = note.noteID 
INNER JOIN person ON note.personID = person.personID 
WHERE noteID = '#attributes.noteID#' 
    AND personID = '#attributes.personID#' 
+5

Quelle erreur obtenez-vous? –

Répondre

8

La raison pour laquelle ce que vous tentez d'utiliser ne fonctionne pas, c'est parce que MySQL doesn't support join syntax in the delete statement in the manner you tried.

Utilisation:

DELETE FROM NOTEPROJECT 
WHERE noteID = '#attributes.noteID#' 
    AND note_id IN (SELECT n.note_id 
        FROM NOTE n 
        WHERE n.personID = '#attributes.personID#') 

... ou avec exists:

DELETE FROM NOTEPROJECT 
WHERE noteID = '#attributes.noteID#' 
    AND EXISTS (SELECT NULL 
       FROM NOTE n 
       WHERE n.note_id = note_id 
        AND n.personID = '#attributes.personID#') 
+1

Bien que cela puisse fonctionner, la réponse de @ AlbertoZaccagni ci-dessous peut être mieux adaptée à certaines situations (y compris de grandes quantités de données). – wbyoung

2

devrait être:

DELETE noteproject FROM noteproject 
INNER JOIN ... 

Vous pouvez écrire:

DELETE FROM noteproject USING noteproject 
INNER JOIN ... 
+0

'DELETE noteproject FROM noteproject' est une syntaxe incorrecte: http://dev.mysql.com/doc/refman/5.0/fr/delete.html –

+1

Cette page donne l'exemple: DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 OERE t1.id = t2.id ET t2.id = t3.id; – Paul

9

Je n'ai pas de db en ce moment pour tester ce que je dis, mais here's a reference to the mysql docs où votre cas est pris comme exemple:

Vous pouvez spécifier plusieurs tables dans une instruction DELETE pour supprimer des lignes d'une ou de plusieurs tables en fonction de la condition particulière de la clause WHERE.

Et aussi:

1) Pour la première syntaxe plusieurs tables, les lignes correspondant uniquement dans les tables énumérées avant la clause FROM sont supprimés.
2) Pour la deuxième syntaxe de tables multiples, seules les lignes correspondantes des tables répertoriées dans la clause FROM (avant la clause USING) sont supprimées.
L'effet est que vous pouvez supprimer des lignes de plusieurs tables en même temps et ont des tables supplémentaires qui sont utilisés uniquement pour la recherche:

1) 
DELETE t1, t2 
FROM t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

2) 
DELETE FROM t1, t2 
USING t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

Ces énoncés comprennent les trois tables lorsque vous recherchez des lignes à supprimer , mais supprimez les lignes correspondantes uniquement à partir des tables t1 et t2.

0

Essayez dans la partie WHERE

tblname.noteID = '#attributes.noteID#' AND tblname.personID = '#attributes.personID#' 
3

testé avec MySQL 5.1.41:

DELETE np 
FROM noteproject np 
INNER JOIN note n ON np.noteID = n.noteID 
INNER JOIN person p ON n.personID = p.personID 
WHERE n.noteID = '#attributes.noteID#' 
    AND p.personID = '#attributes.personID#'; 

Explication:

  • Vous devez qualifier noteID et personID avec des noms de table ou des alias de table dans la clause WHERE, ou bien MySQL se plaint qu'ils sont ambiguës (car la colonne existe dans plus d'une table).
  • Cochez la case syntax pour le multi-table DELETE. Il existe plusieurs formes différentes, mais vous ne correspondiez à aucune des formes de syntaxe légale.