2014-01-08 233 views
0

我有麻烦找到正确的SQL语句删除条目JOIN

我有3个表:

1.) Messages 
2.) Mail_Inbox 
3.) Mail_Outbox 

新的消息存储在消息和其ID同时存储其它表。 用户可以从收件箱和发件箱文件夹中删除他们的邮件。

我想杜解析一个单一的sql语句删除所有条目从邮件中没有条目在收件箱和发件箱与相应的ID存在。

我仍然发现一个工作声明,它告诉我正确的ID,但我找不到删除它们的方法。

SELECT Messages.Message_ID 
FROM `Messages` 
LEFT JOIN Mail_Inbox On Messages.Message_ID = Mail_Inbox.Message_ID 
LEFT JOIN Mail_Outbox On Messages.Message_ID = Mail_Outbox.Message_ID 
WHERE ISNULL(Mail_Outbox.Mail_ID) AND ISNULL(Mail_Outbox.Mail_ID) 

我尝试这样做:

DELETE FROM Messages 
WHERE Message_ID = (SELECT Messages.Message_ID 
        FROM `Messages` 
        LEFT JOIN Mail_Inbox On Messages.Message_ID = Mail_Inbox.Message_ID 
        LEFT JOIN Mail_Outbox On Messages.Message_ID = Mail_Outbox.Message_ID 
        WHERE ISNULL(Mail_Outbox.Mail_ID) AND ISNULL(Mail_Outbox.Mail_ID)) 

但得到这个错误:您不能在指定目标表 '消息' 的更新FROM子句

:-(

+0

您的选择将从收件箱中查找邮件。您需要将'WHERE'改为'ISNULL(Mail_Inbox.Mail_ID)AND ISNULL(Mail_Outbox.Mail_ID)' – TheConstructor

回答

1

根据DELETE,不可能使用要从子查询中删除的表格 - 文档

SELECT 
    Messages.Message_ID 
FROM `Messages` 
    LEFT JOIN Mail_Inbox ON Messages.Message_ID = Mail_Inbox.Message_ID 
    LEFT JOIN Mail_Outbox ON Messages.Message_ID = Mail_Outbox.Message_ID 
WHERE ISNULL(Mail_Inbox.Mail_ID) AND ISNULL(Mail_Outbox.Mail_ID) 

成为

DELETE 
    Messages 
FROM `Messages` 
    LEFT JOIN Mail_Inbox ON Messages.Message_ID = Mail_Inbox.Message_ID 
    LEFT JOIN Mail_Outbox ON Messages.Message_ID = Mail_Outbox.Message_ID 
WHERE ISNULL(Mail_Inbox.Mail_ID) AND ISNULL(Mail_Outbox.Mail_ID) 
+0

ahhh,thx很多!完美的作品! – user2856074

+0

呃,还有一些改进的空间 – Strawberry

+0

@Strawberry你是对的。我只是从问题中复制而来,这个问题在mail_outbox中非常复杂。 – TheConstructor

-2
DELETE FROM Messages WHERE Message_ID IN (some subquery that select Message_IDs) 

您当前的子查询会给你所有了Message_ID因为你使用LEFT JOIN将删除所有邮件。使用INNER JOIN。

+0

'INNER JOIN'不会导致任何结果。 'LEFT JOIN'结合检查fk-column中的'NULL'.values会给出隔离的行。 'INNER JOIN'只能给你想要保留的行。 – TheConstructor