嗨,我目前正在处理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;
这将适用于
table2
和table3
中缺少的行。如果table1
中没有匹配的行,则不会删除任何内容。