2011-05-17 34 views
3

我试图做这样的事情:MySQL - 如何从嵌套表中删除select时使用该表?

DELETE FROM table_1 
WHERE table_1.id IN (SELECT table_1.id 
         FROM table_1, 
          table_2, 
          table_3 
         WHERE table_1.id = table_2.table_1_id 
         AND table_2.id = table_3.table_2_id 
         AND table_3.id = 5) 

好像MySQL不会让我有在嵌套SELECT table_1。建议?

+0

我不知道为什么它不会......它会在执行DELETE之前执行SELECT。你遇到了什么错误? – 2011-05-17 23:56:32

回答

4

你可能会收到此错误:

ERROR 1093 (HY000): You can't specify target table 'table_1' for update in FROM clause. 

你应该能够做到这一点使用MySQL的多表DELETE语法来代替:

DELETE table_1.* 
FROM table_1, 
     table_2, 
     table_3 
WHERE table_1.id = table_2.table_1_id 
AND table_2.id = table_3.table_2_id 
AND table_3.id = 5 

上面的查询应该工作,但作为我会推荐使用ANSI JOIN语法的一般规则:

DELETE table_1.* 
FROM table_1 
INNER JOIN table_2 on table_2.table_1_id = table_1.id 
INNER JOIN table_3 on table_3.table_2_id = table_2.id 
WHERE table_3.id = 5 
+0

@IKE - 是的,这是我得到的错误。问题是我需要删除多个记录,而不仅仅是'id ='指定的记录。这就是为什么我试图使用'IN'和嵌套选择。 – StackOverflowNewbie 2011-05-18 00:41:11

+0

您可以使用多表删除语法删除多行。只需带上你的嵌套SELECT并将其变为DELETE。我刚刚从你的例子中复制了代码。如果它不代表您正在运行的实际查询,请更新您的示例。 – 2011-05-18 00:47:58

+0

对不起,嵌套select会返回很多table_1.id。这就是我使用'IN'的原因。这有帮助吗? – StackOverflowNewbie 2011-05-18 00:56:04