嗨,我目前正在处理3个表,其中1个查询删除所有具有匹配id的行,问题是有时第三个表t3不包含任何数据,因此整个脚本中断。
即使在第三个t3表中没有匹配项,我是否可以让这个querye从3个表中的2个表中删除?

DELETE t1, t2, t3
 FROM table1 t1
  table2 t2
  table3 t3
 WHERE t1.column1 = 1
 AND t2.column2 = 1
 AND t3.column3 = 1 // When this one does not have any matches the whole script fails

一个简单但在我看来“弱”的方法是把它分成3个不同的查询,但这都是一个耻辱,我不是吗?

最佳答案

不要在FROM子句中使用逗号。始终使用正确、明确、标准的JOIN语法。
在您的情况下,您需要一个LEFT JOIN

DELETE t1, t2, t3
    FROM table1 t1 LEFT JOIN
         table2 t2
         ON t1.column = t2.column LEFT JOIN
         table3 t3
         ON t1.column = t3.column
    WHERE t1.column1 = 1;

这将适用于table2table3中缺少的行。如果table1中没有匹配的行,则不会删除任何内容。

10-07 19:24
查看更多