2009-12-25 112 views
2

有人可以帮助我了解什么是错的这个查询:MySQL和DELETE查询与加入

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

你会得到什么错误? – 2009-12-25 23:14:58

回答

8

你试图使用的原因不起作用,是因为MySQL doesn't support join syntax in the delete statement in the manner you tried

用途:

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

...或使用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

尽管这可能奏效,但@ AlbertoZaccagni的答案可能更适合某些情况(包括大量数据)。 – wbyoung 2013-10-03 13:00:53

2

应该是:

DELETE noteproject FROM noteproject 
INNER JOIN ... 

或者,你可以写:

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

'从noteproject'删除noteproject是不正确的语法:http://dev.mysql.com/doc/refman/5.0/en/delete。html – 2009-12-25 23:24:29

+1

该页面给出的例子:DELETE t1,t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id = t2.id AND t2.id = t3.id; – Paul 2009-12-27 11:48:33

9

我目前没有db来测试我在说什么,但here's a reference to the mysql docs以您的案例为例:

根据WHERE子句中的特定条件,您可以在DELETE语句中指定多个表以从一个或多个表中删除行。

并且:

1)对于第一多个数据表的句法,从表中仅匹配行列出的FROM子句被删除之前。
2)对于第二个多表语法,只删除FROM子句(USING子句之前)中列出的表中的匹配行。
的效果是,你可以在同一时间删除多个表行,有仅用于搜索附加表:

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; 

这些语句使用所有三个表的行删除搜索时,但只从表t1和t2中删除匹配的行。

0

尝试在WHERE部分

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

测试与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#'; 

说明:

  • 您需要WHERE子句中出线noteIDpersonID与表名或表的别名,或者MySQL的抱怨,他们是不明确的(因为列多个表存在)。
  • 检查syntax多表DELETE。有几种不同的形式,但你没有匹配任何合法的语法形式。